Herhangi bir karmaşık yürütmeden önce boşta durumdayken, Heap'ta 23 MB ve TaskManager'da java.exe işlem boyutunun 194 MB olduğu bir java uygulamasına sahibim. Bazı karmaşık işlemlerden sonra, java.exe'nin boyutu 500MB'a kadar büyüdü ve yığın boyutu da büyüdü. System.gc() yöntemini çağırarak, yığın boyutu birkaç tam GC'den sonra 23MB'ye düşürülür. Ancak java.exe'nin boyutu, yaklaşık 43 MB veriye sahip olan yaklaşık 600MB'den yaklaşık 237 MB'a düşürüldü. Bunu azaltmanın bir yolu var mı? Yoksa bazı davranışlardan dolayı mı?java.exe işlemi daha fazla bellek kullanıyor ve boş bırakmıyor
cevap
Bu normaldir, endişelenmeyin. JVM, bazı karmaşık mantığı yürütmesi gerektiğinde hafızayı kazanır. Java işlemleri tamamlandığında, JVM bu hafızayı ayrılmış bir alan olarak tutmaya devam eder ve işletim sistemine geri gönderilmez. Bu mimari, performansa yardımcı olur, çünkü JMV'nin aynı işletim sistemini aynı işletim sisteminden talep etmesi gerekmez. Hala -Xmx JVM parametresinde tanımladığınız aralıkta olacaktır.
Bazı ilginç ayrıntılar için bu IBM bağlantısına bakın. http://www-01.ibm.com/support/docview.wss?uid=swg21326774
Maalesef bu JVM'nin gri alanlarından biridir; OS ve JVM'nin birbirleri arasında hafızayı nasıl paylaştığı konusunda gerçekten bir kontrole sahip değilsiniz. JVM'yi çalıştırmak için biraz bellek gerektiren bir Sanal İşletim Sistemi olarak düşünün. Hem ana işletim sisteminiz hem de sanal makineniz kaynaklar için açlar ve edinilen kaynaklara mümkün olduğunca fazla bellekte asılmak isterler. İşletim sisteminden daha fazla bellek istemek, zaman alıcı bir işlemdir, bu nedenle , JVMs'un çoğunun, belleğe artık ihtiyaç duymadıklarında da işletim sistemine geri gönderilmemesi gerekir.
Dahili JVM bellek yönetimi hakkında daha fazla bilgi için Oracle'ın bu tanıtım belgesine bakın. http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf
Önce IBM bağlantısını okumanızı öneririm ve sonra beyaz kağıtta açıklanan belleklerin tuhaf dünyasına girebilirsiniz. Her iki bağlantı da çok bilgilendirici ve ilginç. Java işleminin
işletim ayak izi (HotSpot JVM veya sürekli kuşak)
-Xmx
sınırlı o boyutu)
- Java yığından oluşan java iplikleri
Bazı çöp toplan için NIO erişilebilir
-XX:+UseParallelOldGC
veya -XX:+UseConcMarkSweepGC
gibi diğer toplayıcılar kullanılmayan yığın belleğini hiçbir zaman OS'ye geri göndermeyecektir. HotSpot JVM, yukarıda belirtilen tüm bellek alanlarını yönetme/sınırlama seçeneklerine sahiptir, my blog numaralı telefondan bellek boyutlandırması ve GC ayarlamayla ilgili kapsamlı JVM seçenekleri listesini bulabilirsiniz.
Ancak -Xmx seçeneği Yığın boyutunu doğru olarak ayarlamak mı? VisualVM ve YourKit Java Profiler ile kontrol ettiğimde, kullanılmış yığın OS'ye geri döndürülür. Süreç, işlemden önceki aynı boyutta yığın boyutuna sahip olduğundan yığın boyutu sorun değil. Ancak, Windows Görev Yöneticisi'ndeki java.exe işlemi, daha önce kullandığı bellek miktarından daha fazlasını kullanır. –
Anlayışınızın çoğu doğru; dışında "' kullanılan yığın geri işletim sistemine geri döndü '.Yığın bellek, temel işletim sistemi değil, diğer nesneler için JVM'ye döndürülür. Bu nedenle, Windows'ta java.exe beklediğinizden çok daha fazla bellek kullanıyor gibi görünüyor. – Raza
Ancak Yığın Boyutu 500 MB'den 23 MB'ye düştüğünde, Java.exe işlemi yaklaşık 600MB'den 237 MB'ye düştü, dolayısıyla kalan yığının azaltılmasının OS'ye döndüğünü varsaydım. Azaltılmazsa, yığın boyutu 500 MB'den düştü bile, java.exe'nin boyutu yaklaşık 600 MB olmalıdır. Üzgünüm java.exe önce 600MB olduğu bahsetmeyi unuttum. –