Semua orang tampaknya menjawab tentang memori yang berdekatan, tetapi telah mengabaikan untuk mengakui masalah yang lebih mendesak.
Bahkan dengan 100% alokasi memori yang berdekatan, Anda tidak dapat memiliki ukuran heap 2 GiB pada OS Windows 32-bit (* secara default). Ini karena proses Windows 32-bit tidak dapat menangani lebih dari 2 GiB ruang.
Proses Java akan berisi perm gen (sebelum Java 8), ukuran stack per thread, overhead JVM / library (yang meningkat cukup banyak dengan setiap build) semua selain heap .
Lebih lanjut, flag JVM dan nilai defaultnya berubah antar versi. Jalankan saja yang berikut dan Anda akan mendapatkan beberapa ide:
java -XX:+PrintFlagsFinal
Banyak opsi yang memengaruhi pembagian memori masuk dan keluar dari heap. Memberi Anda lebih atau kurang dari 2 GiB untuk dimainkan ...
Untuk menggunakan kembali bagian-bagian dari ini jawaban saya (sekitar Tomcat, tetapi berlaku untuk setiap proses Java):
OS Windows membatasi alokasi memori dari proses 32-bit menjadi 2 GiB secara total (secara default).
[Anda hanya akan dapat] mengalokasikan sekitar 1,5 GiB ruang heap karena ada juga memori lain yang dialokasikan untuk proses (overhead JVM / perpustakaan, ruang perm gen, dll.).
Mengapa Windows 32-bit memberlakukan batas ruang alamat proses 2 GB, tetapi Windows 64-bit memberlakukan batas 4 GB?
Sistem operasi modern lainnya [batuk Linux] memungkinkan proses 32-bit untuk menggunakan semua (atau sebagian besar) dari ruang beralamat 4 GiB.
Meskipun demikian, OS Windows 64-bit dapat dikonfigurasi untuk meningkatkan batas proses 32-bit menjadi 4 GiB (3 GiB pada 32-bit):
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx