2011-07-25 15 views
6

Po kilku dniach debugowania udało mi się przeprowadzić aplikację sieciową średniej wielkości i bardzo dużej na serwerze Tomcat 6.0.32 bez żadnych wycieków PermGen. Po wypełnieniu zobaczyłem spadek PermGen, a programy ładujące klasy zostały zebrane.Rozwiązywanie problemu z PermGenem przy redeploy z Jetty 7

Po wielu radości próbowałem dokonać ponownej implementacji aplikacji bez wycieków w naszym środowisku programistycznym, które składa się z Mavena i wtyczki Jetty.

Niestety wydaje się, że trafienie ograniczenie serwera, jak pokazano na poniższym zrzucie ekranu

Yourkit snapshot http://img811.imageshack.us/img811/7320/jettyclassloaderbeanelr.png

Jetty żądania nici mają silne odniesienie do BeanElResolver co z kolei ma silne odniesienie do wielu klas z moja aplikacja internetowa.

Nie znalazłem żadnego odniesienia, jak opróżnić tę informację.

Jak mogę usunąć ten ostatni wyciek PermGen z mojej aplikacji?


Aktualizacja:

Zrobiłem następujące czynności, aby rozwiązać ten problem, bez powodzenia:

  • zaktualizowany do najnowszej wersji Jetty Plugin (zarówno 7.4.5 i 8.0 .0.M3)
  • używany kolektor CMS: -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

Aktualizacja 2:

+0

Nie rozumiem twojego sformułowania. Co masz na myśli mówiąc o PermGen-Leak? Czy próbowałeś przekazać flagom GC związane z GC takie jak: -XX: + CMSPermGenSweepingEnabled -XX: + CMSClassUnloadingEnabled? Czy spodziewasz się, że uruchomiona aplikacja internetowa zostanie całkowicie pobrana, gdy połączenie nie zostanie nawiązane? –

+0

Anioł: domyślnie twój kontener serwletu przecieka programy ładujące klasy na każdym ponownym wdrożeniu. Definicje klas są przydzielane z generacji permanentnej, więc otrzymasz przeciek PermGen. Jestem pod wrażeniem, że OP zdołał ominąć ten problem z Tomcat 6 i bez flag. –

+0

Robert: proszę, powiedz nam więcej o tym, co zrobiłeś, aby naprawić wyciek w Tomcat 6! Chciałbym wiedzieć, co zrobiłeś. Może Wiki? –

Odpowiedz

2

To jest faktyczny błąd w implementacji EL, który sprawdza się w najnowszych wersjach Jetty.

Wersja 7.5.0, po zwolnieniu, będzie zawierała poprawkę.

0

Nie bezpośrednią odpowiedź na Twoje pytanie, ale można rozważyć użycie JRebel w dev. W przypadku JRebel, w większości przypadków nie trzeba przeprowadzać ponownej instalacji , przez co unika się zarówno permenów, jak i straconego czasu redeploy. To działa bardzo dobrze dla mnie.

+0

Korzystam już z JRebela, ale a) czasami muszę zrestartować, b) nie wszyscy w moim zespole to robią, więc muszę znaleźć dla nich również lepsze rozwiązanie. –