誰もが連続したメモリについて答えているようですが、より差し迫った問題を認めることを怠っています.
100% の連続したメモリ割り当てがあっても、32 ビット Windows OS で 2 GiB のヒープ サイズを使用することはできません (*既定)。これは、32 ビット Windows プロセスが 2 GiB を超えるスペースをアドレス指定できないためです。
Java プロセスには、 perm gen (Java 8 より前)、スレッドあたりのスタック サイズ、JVM/ライブラリのオーバーヘッド (ビルドごとにかなり増加します)がすべて含まれ、さらに heap も含まれます。
さらに、JVM フラグとそのデフォルト値はバージョン間で異なります。以下を実行するだけで、いくつかのアイデアが得られます。
java -XX:+PrintFlagsFinal
オプションの多くは、ヒープ内外のメモリ分割に影響します。その 2 GiB の多かれ少なかれ、遊ぶためにあなたを残します...
私のこの回答の一部を再利用するには(Tomcatについてですが、Javaプロセスに適用されます):
Windows OS では、32 ビット プロセスのメモリ割り当てが合計で 2 GiB に制限されています (デフォルト)。
プロセスには他のメモリが割り当てられているため (JVM/ライブラリのオーバーヘッド、perm gen 領域など)、約 1.5 GiB のヒープ領域しか割り当てることができません。
32 ビット Windows では 2 GB のプロセス アドレス空間制限が課されるのに、64 ビット Windows では 4 GB 制限が課されるのはなぜですか?
他の最新のオペレーティング システム [Cough Linux] では、32 ビット プロセスが 4 GiB のアドレス指定可能な空間のすべて (またはほとんど) を使用できます。
つまり、64 ビット Windows OS は、32 ビット プロセスの制限を 4 GiB (32 ビットでは 3 GiB) に増やすように構成できます。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx