2015-02-10 10 views
5

Liste der Garbage Collectors:Welche Java-Müllsammler reinigen PermGen?

  • Serien GC
  • Parallel GC
  • Parallel Old GC
  • Conc Mark Sweep GC
  • G1 GC

Ich weiß, dass die Conc Mark Sweep GC unterstützt die Bereinigung von PermGen, wenn Sie die Option ClassUnloading JVM aktivieren. Mögen andere Müllsammler die Reinigung von PermGen unterstützen?

Grund: Wir verwenden Spring, Hibernate und Groovy, die eine Menge Proxies erstellen und Perm Gen wird groß.

Edit: Sollte erwähnt haben, dass ich Java 7 verwende. Ich bin bewusst, Java 8 Entfernen Perm Gen und hoffentlich wird irgendwann in der Zukunft zu aktualisieren. In der Zwischenzeit meine Frage ist, ob die anderen Müllsammler Reinigung PermGen anders als Conc Mark Sweep unterstützen.

  • Serien GC
  • Parallel GC (Glauben -Server verwendet diese standardmäßig aktiviert und bestätigt, dass es zul gen bereinigt)
  • Parallel Old GC
  • Conc Mark Sweep GC (kann zul gen reinigen JVM flag)
  • G1 GC
+1

Wenn Sie OOME: PermGen Leerzeichen Fehler, dann ist es wahrscheinlich aufgrund von Speicherverlusten, nicht eine fehlerhafte GC-Engine. –

+1

Sie könnten auf Java 8 aktualisieren, in dem PermGen [wurde entfernt] (http://openjdk.java.net/jeps/122). – Jesper

Antwort

3

Alle Algorithmen PermGen reinigen, aber

  • nicht jeder GC-Zyklus gehören PermGen Reinigung
  • CMS kann PermGen reinigen gleichzeitig, G1 haben stop-the-world Voll GC worden erfordert Klassen zu entladen (clean PermGen) bis Java 8u40
  • Java 8 haben mLokal statt PermGen, aber es muss Müll gesammelt werden

(sonst werden Sie OOME in mLokal bekommen) ich habe kämpfen OOME in PermGen ziemlich viel, wenn ich aktiv Classloader verwendet wurde mehrere JVM zu simulieren im Einzelprozess für Tes zu Zwecken. Mein Fazit: PermGen GC ist einfach nicht sehr zuverlässig. Ein Lauf funktioniert wie erwartet, anderer wirft es OOEM.

+1

Mit CMS (aktiviert über '-XX: + UseConcMarkSweepGC') müssen Sie möglicherweise einige JVM-Parameter hinzufügen, um den Speicherbereich PermGen tatsächlich zu bereinigen. Ich glaube, am häufigsten ist, dass Sie '-XX: + CMSClassUnloadingEnabled' hinzufügen müssen. Manchmal brauchen Sie auch '-XX: + CMSPermGenSweepingEnabled ', also empfehle ich, das hinzuzufügen und stdout/stderr beim Start zu beobachten. Stimmen Sie auch mit der Nichtvorhersagbarkeit, mindestens mit Parallell überein. CMS und G1 waren viel zuverlässiger für mich, als ich an meiner [ClassLoader Leak Prevention Library] arbeitete (https://github.com/mjiderhamn/classloader-leak-prevention) –