Ich versuche zu verstehen, was die Konzepte von jung, alt und permanente Generationen sind in der Java Heap-Terminologie, und genauer gesagt die Wechselwirkungen zwischen den drei Generationen.
Meine Fragen sind:
Dies scheint ein weit verbreitetes Missverständnis zu sein. In Oracle's JVM ist die permanente Generation nicht Teil des Heaps. Es ist ein separater Bereich für Klassendefinitionen und zugehörige Daten. In Java 6 und früher wurden auch interne Zeichenfolgen in der permanenten Generierung gespeichert. In Java 7 werden interne Zeichenfolgen im Hauptobjektheap gespeichert.
Hier ist ein guter Beitrag zur permanenten Generation .
Ich mag die Beschreibungen, die für jeden Bereich im Oracle-Handbuch zu JConsole angegeben sind:
Für die HotSpot Java VM sind die Speicherpools für die serielle Garbage Collection die folgenden.
- Eden Space (Heap): Der Pool, aus dem für die meisten Objekte zunächst Speicher zugewiesen wird.
- Überlebensraum (Haufen): Der Pool mit Objekten, die die Müllsammlung des Eden-Raums überlebt haben.
- Tenured Generation (Heap): Der Pool mit Objekten, die seit einiger Zeit im Überlebensraum existieren.
- Permanente Generierung (Nicht-Heap): Der Pool, der alle reflektierenden Daten der virtuellen Maschine selbst enthält, z. B. Klassen- und Methodenobjekte. Mit Java VMs, die Class Data Sharing verwenden, wird diese Generation in Nur-Lese- und Schreib-Lese-Bereiche unterteilt.
- Code-Cache (kein Heap): Der HotSpot Java VM) enthält auch einen Code-Cache mit Speicher, der zum Kompilieren und Speichern von nativem Code verwendet wird.
Java verwendet die Speicherbereinigung 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 Referenzen darauf gibt), desto weiter wird es heraufgestuft. 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 überleben würde.
Der Haufen ist wie folgt in junge und alte Generationen unterteilt:
Young Generation : Es ist ein Ort, an dem für 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 Garbage Collection von Young Generation überlebt haben.
Permanente Generierung: Dieser Speicherpool enthält, wie der Name schon sagt, permanente Klassenmetadaten und Deskriptorinformationen, sodass PermGen-Platz immer für Klassen und für Klassen reserviert ist, die an die Klassen gebunden sind, zum Beispiel für statische Mitglieder.
Java8 Update: PermGen wird durch Metaspace ersetzt, was sehr ähnlich ist.
Der Hauptunterschied besteht darin, dass Metaspace die Größe dynamisch ändert, d. H., Dass es zur Laufzeit erweitert werden kann.
Java-Metaspace-Speicherplatz: unbegrenzt (Standard)
Code-Cache (virtuell oder reserviert): Wenn Sie HotSpot Java VM) verwenden, umfasst dies den Code-Cache-Bereich der Speicher, der zum Kompilieren und Speichern von nativem Code verwendet wird.
Was ist die junge Generation?
In der jungen Generation werden alle neuen Objekte zugeordnet und gealtert. Wenn sich die junge Generation füllt, entsteht eine kleine Müllsammlung. Eine junge Generation voller toter Gegenstände wird sehr schnell gesammelt. Einige überlebte Objekte sind gealtert und wandern schließlich zur alten Generation.
Was ist die alte Generation?
Die Alte Generation dient zum Speichern von langlebigen Objekten. In der Regel wird ein Schwellenwert für ein Objekt der jungen Generation festgelegt. Wenn dieses Alter erreicht ist, wird das Objekt zur alten Generation verschoben. Schließlich muss die alte Generation eingesammelt werden. Dieses Ereignis wird als große Speicherbereinigung bezeichnet.
Was ist die permanente Generation?
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 Generation wird von der JVM zur Laufzeit basierend auf von der Anwendung verwendeten Klassen aufgefüllt.
PermGen wurde seit der Version Java 8) durch Metaspace ersetzt.
PermSize & MaxPermSize Parameter werden jetzt ignoriert
Wie interagieren/verhalten sich die drei Generationen zueinander?
Tutorial-Artikel zu Bildquelle und Oracle Technetwork: http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html
" Der allgemeine Garbage Collection-Prozess " im obigen Artikel erläutert die Wechselwirkungen zwischen ihnen mit vielen Diagrammen.
Schauen Sie sich das Übersichtsdiagramm an:
Die virtuelle Maschine Java 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 Generation enthält Objekte, die die JVM für die Verwaltung durch den Garbage Collector als praktisch erachtet, z. B. Objekte, die Klassen und Methoden sowie die Klassen und Methoden selbst beschreiben.
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 Heap angesehen.
Wie interagieren/verhalten sich die drei Generationen zueinander? Objekte (mit Ausnahme der großen) werden zunächst der jungen Generation zugeordnet. Wenn ein Objekt nach x nein am Leben bleibt. von Speicherbereinigungszyklen wird es zum alten/dauerhaften 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 beiden anderen Generationen.