2010-07-26 8 views
9

Zajmuję się różnymi opcjami dotyczącymi usuwania śmieci na maszynie wirtualnej Java 6 18 i chciałbym otrzymać kilka wskazówek.Różne opcje rozwiązywania problemów z PermGenem

Uruchomimy naszą aplikację na JBoss, a od czasu do czasu zdarzają się niesławne błędy PermGen podczas redeploys. W Internecie istnieje wiele sprzecznych i przestarzałych informacji o najlepszym sposobie rozwiązania lub złagodzenia tego problemu.

Od what I can see dodaje jest poprawna:

  • opcji VM na własną rękę nie rozwiąże ten problem tylko opóźnić.
  • Jedynym niezawodnym sposobem rozwiązania tego problemu jest naprawienie błędów kodowania na samym serwerze aplikacji (mało prawdopodobne) lub na kodzie (nasz kod lub biblioteki innych firm) uruchomionym na serwerze aplikacji (bardziej prawdopodobne). Wypełnianie Permgen jest często wynikiem odwołań od obiektów ładowanych przez program ładujący klasy do obiektów ładowanych przez program ładujący klasy Application Server, zapobiegając w ten sposób wyrzucaniu śmieci z programu ładującego klasy aplikacji.

Mam dwa pytania wynikające z tego:

  1. Czy powyższe są prawidłowe?
  2. Gdzie są dostępne opcje maszyn wirtualnych CMSClassUnloadingEnabled i CMSPermGenSweepingEnabled? Z tego, co widzę, CMSClassUnloadingEnabled zastępuje lub domyślnie włącza CMSPermGenSweepingEnabled. Czy któryś z nich pomaga w powyższym problemie?

Odpowiedz

6

Niestety, odpowiedzi są:

  1. Tak
  2. tych opcji VM będzie odłożyć tylko problem.

Podstawowy problem polega na tym, że GC nie zbiera śmieci silnie osiągalnego obiektu. Musisz dowiedzieć się, dlaczego te stare ładowniki klas aplikacji są nadal dostępne po ponownym wdrożeniu ... i naprawić wyciek.

Można też zrezygnować z szybkiego ponownego rozmieszczenia na serwerach produkcyjnych lub częściej uruchamiać kontener internetowy (na przykład JBoss).

+0

+1 przy wyłączaniu hot-wdrażania na serwerach produkcyjnych. Właściwie to robię to do wszystkiego, ale do środowisk stacji roboczych programistów. –

Powiązane problemy