2013-05-20 12 views
5

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

11

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

+0

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. –

+0

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

+0

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. –

2

işletim ayak izi (HotSpot JVM veya sürekli kuşak)

  • Java sınıfı ile ilgili meta
  • olmayan yığın bellek (-Xmx sınırlı o boyutu)

    • Java yığından oluşan java iplikleri

    Bazı çöp toplan için NIO erişilebilir

  • yığın alanı tion algoritmaları boş belleği işletim sistemine geri döndürüyor, diğer değil. HotSpot JVM'de, seri eski alan toplayıcı (genellikle varsayılan olarak etkinleştirilir) belleğe tekrar işletim sistemine geri döner (böylece işlemin küçülmesini görebilirsiniz). Yine de, -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.

  • İlgili konular