Como você já percebeu, a memória endereçável do seu processo de usuário é limitada a 2 GB em janelas de 32 bits (metade do espaço de endereço de 4 GB é reservado para o sistema operacional). Mas você também deve levar em conta que a memória heap não é o único tipo de memória que o Java-VM usa: também há requisitos para alocações nativas de memória, espaço de pilha, perm-gen, cache de código, etc. para vir dos mesmos 2GB que estão disponíveis. Portanto, o tamanho máximo exato do heap pode variar entre as versões java (talvez até mesmo entre computadores diferentes), mas de acordo com o Oracle
On most modern 32-bit Windows systems the maximum heap size will range from 1.4G to 1.6G.
Assim, para qualquer coisa que precise de 1,5 GB de tamanho, você pode estar sem sorte em uma JVM de 32 bits (e assim por diante em um sistema operacional de 32 bits).
Você pode ganhar MB adicional reduzindo outros conjuntos de memória, por exemplo definindo -XX:ReservedCodeCacheSize
(padrão 32m) ou -XX:MaxPermSize
(padrão 64m), mas isso pode levar a outros problemas durante a execução do aplicativo.