2010-01-03 22 views
13

İzin verdiğim bir gen bellek sızıntısı var. Jvisualvm kullanarak profil oluşturma, sıcak dağıtım yapılırken (örn. JVM'yi öldürmeden, tomcat, WebSphere, WebLogic'de bir uygulamayı durdurup başlatmaya başladığında) PermGen alanının sürekli olarak arttığını gösterir.Java Sınıfı (PermGen) Bellek Kaçak (Web Uygulamaları) - Genel Çözüm?

Okuma sonrasında, jhat ve diğer gelişmiş araçları kullanarak, muhtemelen üst sınıf yükleyicilerinde bulunan bir sınıftan WebAppClassLoader referansını aldığımı fark ettim.

Ben böylece (ı

çöp toplanacak değil, sınıfından yükleyici sorumludur öğrenir basit bir yardımcı yok mudur jhat bazı kitlesel JavaScript tabanlı sorguları yaptığı halde bunu saptayamadığı tarafından yüklenen sınıfların çöp toplama izin)?

Ben JProfiler, jvisualvm, jhat ve tüm LMGTFY arkadaşlara Google'da

çok çalıştı - Bir gün ve adım talimatlar, hiçbir şans adımla forumları okurken bir buçuk geçirdim. Çıktıları olan bir yardımcı program veya kod arıyorum: Y sınıfının Nesne X'i, sınıflarınızın kaldırılmasını engelleyen tek GC kökünü oluşturur.

+0

JProfiler size hangi bilgileri verdi? Çöp toplayıcısını açıkça aradığınızda hangi nesneler kalır? – Bozho

+0

ve nasıl sıcak dağıtım yapıyorsunuz (tomcat'ta)? – Bozho

+0

@Bozho - Tomcat Manager'ı kullanarak durdur/başlat düğmesine basın. Kalan nesneler WebAppClassLoader ve yüklenen sınıfların tamamıdır. En yakın GC kök avı pratik sonuçlar vermedi. –

cevap

11

Tatmin edici ve kolay bir çözüm var: Üretim ortamlarında hotdeploy yapmayın. İki servlet konteynır kümesini kurabilir ve yeniden başlatma ile birer birer güncelleştirebilirsiniz.

+1

Bu yüksek kullanılabilirlik dağıtım mimarileri için oldukça yaygın bir modeldir. –

+0

Peki müşteriyi nasıl ikna edelim? Bu deseni açıklayan bir beyaz kağıt var mı? –

+2

Bu kabul edilen yanıt olmamalı. Yerel bir test ortamında aynı sorunu yaşıyorum ve eğer yapabilirsem Tomcat’i yeniden başlatmaktan gerçekten çok hoşlanırım. – ripper234

5

Sık tekrar dağıtımların gerçekleri ... En iyi yapmak -XX: MaxPermSize = 256m kullanarak perm geninin boyutunu arttırmaktır. Bu, jvm yeniden başlatma başına bazı yeniden dağıtımlar alabilir. Ya da okumaya devam edin http://my.opera.com/karmazilla/blog/2007/03/15/permgen-strikes-back

Sınıf yükleyicileri hiç bir şekilde gc-edemezlerse, jvm ile çalışmanın hiç yardımcı olmadığını unutmayın. Özellikle üretimde, sık kullanılan dağıtımları unutmanız daha iyi olur, çünkü dev için kullanışlı, yine de.

+0

kullanın Bunu zaten var 256, yaklaşık 4-5 yeniden dağıtımları sağlar –