Jeder scheint über zusammenhängende Erinnerungen zu antworten, hat es jedoch versäumt, ein dringlicheres Problem anzuerkennen.
Selbst bei einer zu 100% zusammenhängenden Speicherzuweisung können Sie unter einem 32-Bit-Windows-Betriebssystem (standardmäßig *) keine Heap-Größe von 2 GiB haben. Dies liegt daran, dass 32-Bit-Windows-Prozesse nicht mehr als 2 GB Speicherplatz adressieren können.
Der Java-Prozess enthält neben dem Heap auch Perm-Gen (vor Java 8), Stapelgröße pro Thread, JVM- / Bibliotheks-Overhead (der sich mit jedem Build erheblich erhöht) .
Darüber hinaus ändern sich die JVM-Flags und ihre Standardwerte zwischen den Versionen. Führen Sie einfach Folgendes aus und Sie erhalten eine Vorstellung:
java -XX:+PrintFlagsFinal
Viele der Optionen wirken sich auf die Speicheraufteilung in und aus dem Heap aus. Sie haben mehr oder weniger von diesen 2 GiB zum Spielen ...
Zur Wiederverwendung Portionen dieser Antwort von mir (etwa Tomcat, sondern gilt für alle Java - Prozess):
Das Windows-Betriebssystem begrenzt die Speicherzuweisung eines 32-Bit-Prozesses auf insgesamt 2 GB (standardmäßig).
[Sie können nur] ca. 1,5 GB Heap-Speicherplatz zuweisen, da dem Prozess auch anderer Speicher zugewiesen ist (JVM- / Bibliotheks-Overhead, Dauerwellen-Speicherplatz usw.).
Warum legt 32-Bit-Windows eine Prozessadressraumbeschränkung von 2 GB fest, 64-Bit-Windows jedoch eine Beschränkung von 4 GB?
Andere moderne Betriebssysteme [Husten Linux] ermöglichen es 32-Bit-Prozessen, den gesamten (oder den größten Teil) des adressierbaren 4-GiB-Raums zu nutzen.
Das heißt, 64-Bit-Windows-Betriebssysteme können so konfiguriert werden, dass das Limit von 32-Bit-Prozessen auf 4 GiB (3 GiB auf 32-Bit) erhöht wird:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx