Todo el mundo parece estar respondiendo sobre la memoria contigua, pero se han olvidado de reconocer un problema más urgente.
Incluso con una asignación de memoria contigua al 100%, no puede tener un tamaño de pila de 2 GiB en un sistema operativo Windows de 32 bits (* de forma predeterminada). Esto se debe a que los procesos de Windows de 32 bits no pueden abordar más de 2 GiB de espacio.
El proceso de Java contendrá perm gen (pre Java 8), tamaño de pila por hilo, sobrecarga de JVM / biblioteca (que aumenta mucho con cada compilación), todo además del montón .
Además, los indicadores de JVM y sus valores predeterminados cambian entre versiones. Simplemente ejecute lo siguiente y obtendrá una idea:
java -XX:+PrintFlagsFinal
Muchas de las opciones afectan la división de la memoria dentro y fuera del montón. Dejándote con más o menos de esos 2 GiB para jugar ...
Para reutilizar partes de esta respuesta mía (sobre Tomcat, pero se aplica a cualquier proceso de Java):
El sistema operativo Windows limita la asignación de memoria de un proceso de 32 bits a 2 GiB en total (por defecto).
[Solo podrá] asignar alrededor de 1,5 GiB de espacio de pila porque también hay otra memoria asignada al proceso (la sobrecarga de JVM / biblioteca, espacio de generación permanente, etc.).
¿Por qué Windows de 32 bits impone un límite de espacio de direcciones de proceso de 2 GB, pero Windows de 64 bits impone un límite de 4 GB?
Otros sistemas operativos modernos [tos Linux] permiten que los procesos de 32 bits usen todo (o la mayoría) del espacio direccionable de 4 GiB.
Dicho esto, los sistemas operativos Windows de 64 bits se pueden configurar para aumentar el límite de procesos de 32 bits a 4 GiB (3 GiB en 32 bits):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx