JVM Bellek Tüketimi


9

Tomcat'i düşük bellek sisteminde (150-256Mb) çalıştırmaya çalışıyorum. JVM'yi -Xmx64m (zaten varsayılan olması gerekir) ile başlatmama rağmen, işlem hemen 200Mb + alır.

Acaba JVM'nin neden bu kadar belleğe ihtiyacı var, ya da bunu ayarlamanın bir yolu var mı? Düşük bellek tüketimi için diğer JVM'ler güneşten daha mı iyidir - ve tomcat ile çalışırlar mı?

Yanıtlar:


5

Yığına ek olarak ( -Xmsve ile belirtilir -Xmx) yığın olmayan alanları da eklemeniz gerekir. Bunlar

  • Başlangıçta 32bit sistemlerde 64mb ve 64bit sistemlerde 96mb olan Perm Gen
  • JVM'ye bağlı olarak 20 ila 40mb arasındaki Kod Önbelleği
  • NIO arabellek alanı (burada DirectByteBuffers çekilir), bu başlangıçta 64mb

Birkaç düzine mb olacak JVM'nin çalışma alanı da var.

Sunucu sınıfı bir makine kullanırken Sun JVM'nin otomatik boyutlandırmasının da farkında olmalısınız . Zamanla sunucu sınıfının tanımı (2Gb bellek, birden fazla çekirdek) bir miktar amortisman yaşadı ve şimdi çoğu makine -serveroptimizasyonları tetikleyebiliyor . Benim tavsiyem her zaman -Xmsve -Xmxayarlarını belirtmek ve -serverçok iyi bir neden düşünemediğiniz sürece geçmek .


Ayrıca JVM'nin yalnızca ayırdığı ve henüz kullanmadığı Sanal belleğe de dikkat edin.
Steve Schnepp

Doğru, PermGen ve Kod Önbellek gibi bu segmentlerin çoğu başlangıçta tahsis edilir, ancak çoğu çekirdek gerektiğinde bu segmentlere sayfa tahsis etmekten kaçınır.
Dave Cheney

1
Bilgi için teşekkürler - bence bu hafızanın nereye gittiğini açıklıyor. Bu değerleri değiştirmenin bir yolu var mı? Daha da iyisi, her bölümün ne kadarının kullanıldığını görmenin bir yolu olurdu - Java hata ayıklama / izleme araçlarından herhangi birinin bunu yapmasına izin verip vermediğini bilmiyorum?
Draemon

1
Kullanılan çeşitli segmentler hakkında fikir edinmek için pmap veya jmap kullanabilirsiniz. Ortak seçeneklerin çoğu (ve varsayılanları) burada listelenmiştir, java.sun.com/javase/technologies/hotspot/vmoptions.jsp . Sık sık değişir ve OS (genellikle yığın boyutu) ve arch (64bit OS'ler genellikle daha büyük JVM alanları anlamına gelir) farklılıklarına tabidir
Dave Cheney

3

-Xmx seçeneğiyle JVM'nin ayırdığı yığının boyutunu kısıtlarsınız ... JVM'nin ihtiyaç duyduğu ek kaynaklar vardır ...

"Bellek için teşekkürler" *, bir JVM'nin belleği nasıl kullandığını açıklayan iyi bir makaledir ...

Bunun dışında IBM'in JVM'sini deneyebilir, Tomcat ile çalışması gerekir, bazı ücretsiz JVM uygulamalarının işe yarayıp yaramadığını bilmiyorum.

Yine de, hafızası bu kadar düşük olan bir makinenin işinize yarayacağını düşünmüyorum. Java sadece belleğe ihtiyaç duyar.

* Yeni kullanıcılar köprü gönderemediğinden, bu makaleye kendiniz bakmanız gerekir ... Google'da "bellek IBM için teşekkürler" için ilk hit.


3
ibm.com/developerworks/java/library/j-nativememory-linux - "Bellek için teşekkürler" makalesine bağlantı
StackKrish


0

Bulduğum kullanışlı bir teknik, yığın ile permgen uzayının ne kadar bellek kullandığını görmek için JMX izlemeyi kullanmaktır.

Tomcat'te JMX'i burada açıklandığı gibi kurun http://tomcat.apache.org/tomcat-6.0-doc/monitoring.html

Sonra JConsole kullanın (JDK 5 veya JDK 6 ile birlikte gelir) - bellek etiketi zaman içinde bellek tüketimini izler.

Ayrıca - webapps'in yumuşak yeniden başlatmalarına dikkat edin. Bir web uygulamasını yeniden yüklerseniz, permen alanı çöp toplanmaz ve zamanla birikir. Permgen boşluğunu geri kazanmak için Tomcat'in tam bir durdurma / başlatma işlemini yapmanız gerekir.


VisualVM, JConsole yerine de kullanılabilir ve JVM'de bellek sorunları ararken daha da fazla ayrıntı verir. Sorunları bulmak için bunu birden fazla kez kullanmak zorunda kaldım.
Jeremy Bouse
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.