Ich versuche zu verstehen, was die Konzepte junger , alter und permanenter Generationen in der Java-Heap-Terminologie sind, und insbesondere die Interaktionen zwischen den drei Generationen.
Meine Fragen sind:
- Was ist die junge Generation?
- Was ist die alte Generation?
- Was ist die permanente Generation?
- Wie interagieren die drei Generationen miteinander?
Antworten:
Dies scheint ein weit verbreitetes Missverständnis zu sein. In der JVM von Oracle ist die permanente Generierung nicht Teil des Heaps. Es ist ein separater Bereich für Klassendefinitionen und zugehörige Daten. In Java 6 und früheren Versionen wurden auch internierte Zeichenfolgen in der permanenten Generierung gespeichert. In Java 7 werden internierte Zeichenfolgen im Hauptobjektheap gespeichert.
Hier ist ein guter Beitrag zur permanenten Generierung .
Ich mag die Beschreibungen für jeden Bereich im Oracle- Handbuch zu JConsole :
Java verwendet die Garbage Collection für Generationen. Dies bedeutet, dass wenn Sie ein Objekt foo haben (das eine Instanz einer Klasse ist), je mehr Garbage Collection-Ereignisse es überlebt (wenn es noch Verweise darauf gibt), desto weiter wird es befördert. Es beginnt in der jungen Generation (die selbst in mehrere Räume unterteilt ist - Eden und Survivor) und würde schließlich in der festen Generation enden, wenn es lange genug überlebt.
quelle
Junge Generation : Es ist ein Ort, an dem kurze Zeit gelebt und in zwei Räume unterteilt wurde:
Alte Generation : Dieser Pool enthält im Wesentlichen festen und virtuellen (reservierten) Speicherplatz und enthält die Objekte, die nach der Speicherbereinigung durch die junge Generation überlebt haben.
Permanente Generierung: Dieser Speicherpool enthält, wie der Name schon sagt, permanente Klassenmetadaten und Deskriptorinformationen, sodass der PermGen-Speicherplatz immer für Klassen reserviert ist und für Klassen, die an Klassen gebunden sind, z. B. statische Mitglieder.
Code-Cache (virtuell oder reserviert): Wenn Sie HotSpot Java VM verwenden, umfasst dies einen Code-Cache-Bereich, der Speicher enthält, der zum Kompilieren und Speichern von nativem Code verwendet wird.
Höflichkeit
quelle
In der jungen Generation werden alle neuen Objekte zugewiesen und gealtert. Wenn die junge Generation voll ist, führt dies zu einer geringfügigen Müllabfuhr. Eine junge Generation voller toter Gegenstände wird sehr schnell gesammelt. Einige überlebende Objekte sind gealtert und wechseln schließlich zur alten Generation.
Die alte Generation wird verwendet, um lange überlebende Objekte zu speichern. In der Regel wird ein Schwellenwert für Objekte der jungen Generation festgelegt. Wenn dieses Alter erreicht ist, wird das Objekt in die alte Generation verschoben. Schließlich muss die alte Generation gesammelt werden. Dieses Ereignis wird als große Speicherbereinigung bezeichnet
Die permanente Generierung enthält Metadaten, die von der JVM zur Beschreibung der in der Anwendung verwendeten Klassen und Methoden benötigt werden. Die permanente Generierung wird zur Laufzeit von der JVM basierend auf den von der Anwendung verwendeten Klassen gefüllt.
PermGen wurde seit Java 8 durch Metaspace ersetzt.
PermSize- und MaxPermSize- Parameter werden jetzt ignoriert
Artikel zum Tutorial zu Bildquelle und Oracle-Technologie: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
" Der allgemeine Speicherbereinigungsprozess " im obigen Artikel erläutert die Wechselwirkungen zwischen ihnen mit vielen Diagrammen.
Schauen Sie sich das zusammenfassende Diagramm an:
quelle
Die Java Virtual Machine ist in drei Generationen unterteilt: eine junge Generation, eine alte Generation und eine permanente Generation. Die meisten Objekte werden zunächst in der jungen Generation vergeben. Die alte Generation enthält Objekte, die eine Reihe von Sammlungen der jungen Generation überlebt haben, sowie einige große Objekte, die direkt der alten Generation zugeordnet werden können. Die permanente Generierung enthält Objekte, die die JVM für die Verwaltung durch den Garbage Collector als zweckmäßig erachtet, z. B. Objekte, die Klassen und Methoden beschreiben, sowie die Klassen und Methoden selbst.
quelle
Der Speicher in SunHotSpot JVM ist in drei Generationen unterteilt: junge Generation, alte Generation und permanente Generation.
Zu Ihrer Information: Das permanente Gen wird nicht als Teil des Java-Heaps betrachtet.
Wie interagieren die drei Generationen miteinander? Objekte (außer den großen) werden zuerst der jungen Generation zugewiesen. Wenn ein Objekt nach x-Nr. von Müllsammelzyklen wird es zum alten / festen Gen befördert. Daher können wir sagen, dass das junge Gen die kurzlebigen Objekte enthält, während das alte Gen die Objekte enthält, die ein langes Leben haben. Das permanente Gen interagiert nicht mit den anderen beiden Generationen.
quelle