2011-10-07 34 views
30

Hibernate ve glassfish Server kullanarak java web uygulamasını çalıştırıyorum. Ben birkaç kez dağıttıktan sonraPermGen boşluk hatası - Glassfish Sunucu

java.lang.OutOfMemoryError: PermGen space özel durum alıyorum.

Ortam değişkenlerimde -XX:MaxPermSize=128M'u denedim, ancak çalışmıyor.

+0

Bu şeye bakıyorsunuz: http://stackoverflow.com/questions/1996088/java-class-permgen-memory-leak-web-applications-generic-solution – Raedwald

cevap

37

Bu sınıf yükleyici bellek sızıntısı. Uygulamayı yeniden her paylaştığınızda, bunun için yeni bir sınıf yükleyicisi oluşturulur ve uygulamanızın tüm sınıfları yeniden yüklenir. Bu perm gen uzayında bellek tüketir.

Eski sınıf yükleyici ve yüklü tüm sınıfların toplanması gerekir, aksi halde birden çok kez dağıtıldıktan sonra bir PermGen alanına ODE olarak girersiniz. Bir dış sınıf yükleyicisi tarafından yüklenen bir nesne, eski sınıf yükleyici tarafından yüklenen herhangi bir nesneye başvuruda bulunursa, bu çalışmaz. This article, sorunun iyi bir açıklamasını verir. Genel olarak, sınıf yükleyici sızıntılarını analiz etmek zordur ve bazen düzeltilmesi zordur. Eski sınıf yükleyicilerin neden toplanmadığını öğrenmek için bir profiler kullanmalısınız. JProfiler'da yığın yürütücüyü kullanın, glassfish classloader nesnelerini seçin ve çöp toplayıcı köklerine giden yolları kontrol etmek için gelen referans görünümünü kullanın.

Sınıf yükleyici sınıfı org.apache.servlet.jasper.JasperLoader olarak adlandırılır. İşte, sınıf yükleyicisinin sadece yüklü nesnelerin canlı örnekleri tarafından tutulduğu, düzenli bir durumun ekran görüntüsüdür. senin durumda

enter image description here

, dışarıda nesnelere başvurularını görmelisiniz. Bir webloader sızıntısının web konteynırlarındaki diğer bir yaygın nedeni, durdurulmayan bir arka plan iş parçacığıdır. Google Guice, örneğin, 3.0'da böyle bir hatadır.

(Yasal Uyarı: benim şirket JProfiler gelişir) (linux tabanlı os değil) bu sorunu çözmek için

46

aşağıdakileri yapın

1) artış bellek (bu sorun sık gelmediği böylece) tarafından "etki alanı yapılandırılıyor.

<jvm-options>-XX:MaxPermSize=

set it to higher value eg- 198m or 256m

2) Çalışıyorsa edildiği bağlantı noktasını boşaltmak için glassfish süreci öldürmek

/glassfish/etki alanında xml"/ domain1/config

arama için (benim durumumda 8686) açık terminal (linux tabanlı işletim sisteminde) ve tip -

Böyle bir şey neden olacaktır

sudo netstat -npl | grep 8686

..

tcp6 0 0 :::8686 :::* LISTEN 3452/java

sonraki kullanım

kill -9 3452 başlatmaya çalıştığınızda Şimdi (bu durumda 3452) bu süreci

öldürmek glassfish, başlamalıdır.

+0

Teşekkürler efendim! çok iyi! –

9

Eğer Windows kullanıyorsanız, Glassfish işlemini (java.exe * 32) Görev Yöneticisi ile öldürmeyi ve ardından sunucuyu yeniden başlatmayı deneyin.

+0

Bu mükemmel –