Wird die permanente Generation immer seriell auf der HotSpot VM gesammelt?

9

Als ich einen ziemlich ausgereiften Blogeintrag von Oracle gelesen habe, habe ich das gelernt

  

(...) Die permanente Generation wird derzeit seriell gesammelt.

Aber dieser Blog-Eintrag stammt aus ziemlich vielen Jahren und ich frage mich, wie die jüngsten Fortschritte in Garbage-Collection-Algorithmen die Genauigkeit dieser Aussage verändert haben könnten. Ich wundere mich besonders über den neuen G1-Müllsammler, der beschrieben von Oracle mit:

  

Die älteren Garbage Collectors (seriell, parallel, CMS) strukturieren allesamt   Haufen in drei Abschnitte: junge Generation, alte Generation und   permanente Generierung einer festen Speichergröße (...)   Bei der Durchführung von Speicherbereinigungen arbeitet G1 in ähnlicher Weise   zum CMS-Kollektor.

erwähnt aber niemals die permanente Generierung im gesamten Tutorial.

Vom Lesen über CMS - das gemäß der obigen Aussage ähnlich wie G1 funktioniert - habe ich keine expliziten Informationen über die permanente Generation gefunden, aber ich habe daraus gelernt anderer Blog-Eintrag dass

  

(...) Die gleichzeitige Markierung und der Sweep verdichten sich überhaupt nicht. Einmal Objekte   kann nicht mehr zugeordnet werden, wird ein serieller Haupt-GC ausgelöst.

Ich frage mich also, ob moderne Garbage Collectors, wie CMS oder G1, die permanente Generierung vollständig ignorieren und es zu vollständigen GC -Aufrufen belassen, die den alten seriellen GC ausführen, um die permanente Generierung zu bereinigen (Während dieser Serien-GC auch die jungen und reifen Generationen seriell sammelt, was ich nicht als wünschenswert bezeichnen würde, wenn G1 anstelle von CMS verwendet wurde). Ich bin hauptsächlich daran interessiert, herauszufinden, ob es in Bezug auf STW und Sammelzeit teurer ist, die Garbage Collection auf der permanenten Generation durchzuführen, als auf die Sammlung der Tenure Generation.

Bonusfrage : Das Oracle-Tutorial erwähnt, dass die permanente Generierung Teil des Heaps ist. Ich dachte immer, dass die permanente Generation außerhalb des Heaps explizit zugewiesen wurde. Hat sich das in den letzten HotSpot-Implementierungen geändert?

Danke für Ihre Hilfe!

    
Rafael Winterhalter 08.12.2013, 12:22
quelle

1 Antwort

1

Es gibt ein JEP156 , das G1 in die Lage versetzt, Klassen ohne einen vollständigen GC zu entladen, aber im Abschnitt Abhängigkeiten heißt das < Es macht Sinn, mit [ JEP122 ] zu warten, bis die dauerhafte Generation weg ist um JEP156 einfacher zu machen implementieren.

Es sieht also so aus, als könnte dieses Problem tatsächlich in Java 8 gelöst werden, aber nicht nur dank des Metaraums, sondern weil der Metaraum als Voraussetzung für die inkrementelle GC-Klassen vorausgesetzt wird.

Das ist mein Verständnis.

edit: In den letzten Tagen habe ich mir einige der diesjährigen JavaOne Sessions angehört und glücklicherweise habe ich gerade heute eine gefunden über Entfernung von PermGen , die alles sagt:

  • HotSpot benötigt derzeit einen vollständigen GC zum Sammeln von PermGen
  • Dies wird auch nach Einführung von Metaspace
  • noch immer zutreffen
  • Die Übersichtsfolie am Ende scheint zu bestätigen, dass JEP156 noch geplant ist (aber sie redet nicht darüber)
  • Es beantwortet sogar die Bonusfrage, für die ich eine Antwort hatte, aber keine Quelle: Ja, PermGen ist im Heap
Djizeus 12.12.2013, 06:21
quelle