Herkes bitişik hafıza hakkında cevap veriyor gibi görünüyor, ancak daha acil bir sorunu kabul etmeyi ihmal etti.
% 100 bitişik bellek ayırma ile bile, 32 bit Windows işletim sisteminde 2 GiB yığın boyutuna sahip olamazsınız (varsayılan olarak *). Bunun nedeni, 32 bit Windows işlemlerinin 2 GiB'den fazla alanı ele alamamasıdır.
Java işlemi kurutma gen (Java 8 pre), iplik, JVM / kitaplık yükü başına yığın boyutunu içerir (her hangi bir yapı ile oldukça çok artar) her yığın ek olarak .
Ayrıca, JVM bayrakları ve varsayılan değerleri sürümler arasında değişir. Sadece aşağıdakileri çalıştırın ve bir fikir edineceksiniz:
java -XX:+PrintFlagsFinal
Seçeneklerin çoğu, yığın içindeki ve dışındaki bellek bölünmesini etkiler. Sizi oynamak için aşağı yukarı 2 GiB ile bırakıyorum ...
Bu cevabımın bazı kısımlarını yeniden kullanmak için (Tomcat hakkında, ancak herhangi bir Java işlemi için geçerlidir):
Windows İşletim Sistemi, 32 bitlik bir işlemin bellek tahsisini toplamda 2 GiB ile sınırlar (varsayılan olarak).
[Yalnızca] yaklaşık 1,5 GiB yığın alanı ayırabilirsiniz çünkü işlem için ayrılmış başka bellek de vardır (JVM / kütüphane ek yükü, kalıcı alan alanı vb.).
32 bit Windows neden 2 GB işlem adres alanı sınırı koyarken 64 bit Windows 4 GB sınırı koyuyor?
Diğer modern işletim sistemleri [cough Linux], 32-bit işlemlerin 4 GiB adreslenebilir alanın tümünü (veya çoğunu) kullanmasına izin verir.
Bununla birlikte, 64 bit Windows işletim sistemleri, 32 bit işlem sınırını 4 GiB'ye (32 bit üzerinde 3 GiB) yükseltecek şekilde yapılandırılabilir:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366778(v=vs.85).aspx