2015-02-10 15 views
5

Lista śmieci Kolekcjonerzy:Co Java Garbage Collectors cleanup PermGen?

  • szeregowego GC
  • równoległy GC
  • Parallel Old GC
  • Stężenie Mark Sweep GC
  • G1 GC

wiem, że Stężenie Mark Sweep GC obsługuje czyszczenie PermGen po włączeniu opcji JVM ClassUnloading. Czy inne Garbage Collectory obsługują czyszczenie PermGen?

Powód: Używamy Spring, Hibernate i Groovy, które generują wiele serwerów proxy, a Perm Gen staje się wielki.

Edytuj: Powinienem wspomnieć, że używam Java 7. Jestem świadomy, że Java 8 usuwa Perm Gen i mam nadzieję, że uaktualni się kiedyś w przyszłości. W międzyczasie moje pytanie dotyczy tego, czy inni śmieciarze pomagają w czyszczeniu PermGena innego niż Conc Mark Sweep.

  • szeregowego GC
  • GC równoległy (Uwierz -server wykorzystuje ten domyślnie i potwierdził, że sprząta perm gen)
  • Parallel Old GC
  • Stężenie Mark Sweep GC (może oczyścić perm gen używając JVM Flag)
  • G1 GC
+1

Jeśli otrzymasz OOME: PermGen space errors, to najprawdopodobniej z powodu przecieków pamięci, a nie wadliwego silnika GC. –

+1

Można uaktualnić do wersji Java 8, w której PermGen [został usunięty] (http://openjdk.java.net/jeps/122). – Jesper

Odpowiedz

3

Wszystkie algorytmy PermGen czyszczenia, ale

    nie
  • każdy cykl GC obejmują PermGen czyszczenia
  • CMS może oczyścić PermGen jednocześnie, G1 zostały wymagającą stop-the-świat pełen GC rozładować klas (czysty PermGen) aż 8u40 Java
  • Java 8 mają metaspace zamiast PermGen, ale to musi być też zbierane śmieci (inaczej dostaniesz OOME w metaspace)

I zostały walcząc OOME w PermGen sporo kiedy aktywnie wykorzystywane ClassLoaders symulować wiele JVM w pojedynczym procesie dla tes t celów. Mój wniosek: PermGen GC nie jest po prostu niezawodny. Jeden uruchamia się zgodnie z oczekiwaniami, a inny wyrzuca OOEM.

+1

Z CMS (włączony przez '-XX: + UseConcMarkSweepGC') może być konieczne dodanie niektórych parametrów maszyny JVM, aby w rzeczywistości spowodować, że będzie on zbierał PermGen. Uważam, że najczęstszym jest dodanie "-XX: + CMSClassUnloadingEnabled". Czasami możesz również potrzebować '-XX: + CMSPermGenSweepingEnabled', więc zalecam dodanie tego i oglądanie stdout/stderr podczas uruchamiania. Zgadzam się również z niedopuszczalnością, przynajmniej z Parallell. CMS i G1 były dla mnie o wiele bardziej niezawodne, pracując nad moją biblioteką [ClassLoader Leak Prevention] (https://github.com/mjiderhamn/classloader-leak-prevention) –

Powiązane problemy