Todo mundo parece estar respondendo sobre a memória contígua, mas negligenciou o reconhecimento de uma questão mais urgente.
Mesmo com 100% de alocação de memória contígua, você não pode ter um tamanho de heap de 2 GiB em um sistema operacional Windows de 32 bits (* por padrão). Isso ocorre porque os processos do Windows de 32 bits não podem lidar com mais de 2 GiB de espaço.
O processo Java conterá perm gen (pré Java 8), tamanho da pilha por encadeamento, sobrecarga de JVM / biblioteca (que praticamente aumenta com cada construção), tudo além do heap .
Além disso, os sinalizadores de JVM e seus valores padrão mudam entre as versões. Basta executar o seguinte e você terá uma ideia:
java -XX:+PrintFlagsFinal
Muitas opções afetam a divisão de memória dentro e fora do heap. Deixando você com mais ou menos daqueles 2 GiB para brincar ...
Para reutilizar partes desta minha resposta (sobre Tomcat, mas se aplica a qualquer processo Java):
O sistema operacional Windows limita a alocação de memória de um processo de 32 bits a 2 GiB no total (por padrão).
[Você só poderá] alocar cerca de 1,5 GiB de espaço de heap porque também há outra memória alocada para o processo (JVM / sobrecarga de biblioteca, espaço de perm gen etc.).
Por que o Windows de 32 bits impõe um limite de espaço de endereço de processo de 2 GB, mas o Windows de 64 bits impõe um limite de 4 GB?
Outros sistemas operacionais modernos [cough Linux] permitem que os processos de 32 bits usem todo (ou a maioria) do espaço endereçável de 4 GiB.
Dito isso, os sistemas operacionais Windows de 64 bits podem ser configurados para aumentar o limite de processos de 32 bits para 4 GiB (3 GiB em 32 bits):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx