Java-Heap-Terminologie: junge, alte und permanente Generationen?


318

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?

Angenommen, Sie sprechen von Sun JDK / OpenJDK, lesen Sie die Seite auf der OpenJDK-Website zu Storage Management . Unten finden Sie einige Links zu noch mehr Informationen.
Nicholas Riley

1
auch im Zusammenhang mit dieser Frage "Tenured Generation"
gstackoverflow

Antworten:


304

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 :

Für die HotSpot Java VM sind die Speicherpools für die serielle Speicherbereinigung die folgenden.

  • Eden Space (Heap): Der Pool, aus dem der Speicher zunächst für die meisten Objekte zugewiesen wird.
  • Survivor Space (Heap): Der Pool mit Objekten, die die Speicherbereinigung des Eden Space überlebt haben.
  • Tenured Generation (Heap): Der Pool, der Objekte enthält, die seit einiger Zeit im Überlebensbereich vorhanden sind.
  • Permanente Generierung (kein Heap): Der Pool, der alle reflektierenden Daten der virtuellen Maschine selbst enthält, z. B. Klassen- und Methodenobjekte. Bei Java-VMs, die die gemeinsame Nutzung von Klassendaten verwenden, ist diese Generation in schreibgeschützte und schreibgeschützte Bereiche unterteilt.
  • Code-Cache (kein Heap): Die HotSpot Java VM enthält auch einen Code-Cache, der Speicher enthält, der zum Kompilieren und Speichern von nativem Code verwendet wird.

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.


2
Ich glaube, dass ab Java 7 Strings nicht mehr in der permanenten Generation interniert sind.
Tim Goodman

Sie haben Recht, ich bin überrascht, dass dies so lange vor einer Erwähnung überlebt hat. Dann wird in Java 8 die permanente Generierung durch Metaspace ersetzt (obwohl ich nicht sicher bin, wie unterschiedlich dies wirklich sein wird, außer standardmäßig unbegrenzt zu sein)
Joshua McKinnon

9
Joshua - ist "alt" gleichbedeutend mit "fest angestellt" und ist "neu" gleichbedeutend mit "Überlebender"?
Joadha

1
Die Dauerwelle gilt nur vor Java 8.
lwpro2

2
Falls Sie noch auf eine Antwort warten, ja, Sie haben Recht @joadha. Überprüfen Sie diesen Link: codeahoy.com/2017/08/06/basics-of-java-garbage-collection
Recepinanc

197

Der Haufen ist wie folgt in junge und alte Generationen unterteilt:

Junge Generation : Es ist ein Ort, an dem kurze Zeit gelebt und in zwei Räume unterteilt wurde:

  • Eden Space : Wenn ein Objekt mit einem neuen Schlüsselwortspeicher erstellt wurde, der diesem Space zugewiesen wurde.
  • Survivor Space : Dies ist der Pool, der Objekte enthält, die nach der Java-Garbage Collection aus dem Eden Space überlebt haben.

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.

  • Tenured Space: Dieser Speicherpool enthält Objekte, die nach mehrfacher Speicherbereinigung überlebt haben. Dies bedeutet, dass Objekte nach der Speicherbereinigung aus dem Survivor-Speicherplatz ü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.

Java8-Update: PermGen wird durch Metaspace ersetzt, das sehr ähnlich ist.
Der Hauptunterschied besteht darin, dass Metaspace die Größe dynamisch ändert, dh zur Laufzeit erweitert werden kann.
Java Metaspace Space: unbegrenzt (Standard)

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.

Geben Sie hier die Bildbeschreibung ein

Höflichkeit


@Premraj was bedeutet es, dass Metaspace seine Größe dynamisch ändert, dh es kann zur Laufzeit erweitert werden. ? Der einzige Unterschied, dass es standardmäßig nicht grenzüberschreitend ist?
gstackoverflow

1
Hervorragend. Kann ich wissen, wo sich in diesem Bild der Methodenbereich, der Nativestack und der Laufzeitkonstantenpool befinden? und was halten sie entsprechend?

Wenn der Code-Cache für nativen Methodencode verwendet wird, was hat der native Methodenstapel (jeder Thread hat einen)?

49

Was ist die junge Generation?

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.

Was ist die alte 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

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 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

Wie interagieren die drei Generationen miteinander?

Geben Sie hier die Bildbeschreibung ein

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:

Geben Sie hier die Bildbeschreibung ein


Hervorragend. Kann ich wissen, wo sich in diesem Bild der Methodenbereich, der Nativestack und der Laufzeitkonstantenpool befinden? und was halten sie entsprechend?

siehe docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html für weitere Details. Der Methodenbereich wird beim Start der virtuellen Maschine erstellt. Obwohl der Methodenbereich logisch Teil des Heaps ist, können einfache Implementierungen entscheiden, ihn weder zu sammeln noch zu komprimieren. Jeder Laufzeitkonstantenpool wird aus dem Methodenbereich der Java Virtual Machine zugewiesen
Ravindra babu

Bist du sicher, dass ich gelesen habe, dass es Teil des Permgen-Raums ist (der kein Haufen ist)? journaldev.com/2856/…

Oracle Dokumentation ist authentischer
Ravindra Babu

Ist der Schwellenwert für Objekte der jungen Generation in Zeiteinheiten (z. B. ms) festgelegt? oder GC-Runden?
Sehr objektiv

16

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.


1

Der Speicher in SunHotSpot JVM ist in drei Generationen unterteilt: junge Generation, alte Generation und permanente Generation.

  • Junge Generation: Die neu erstellten Objekte werden der jungen Generation zugeordnet.
  • Alte Generation: Wenn das neue Objekt einen größeren Heap-Speicherplatz anfordert, wird es direkt der alten Generation zugewiesen. Auch Objekte, die einige GC-Zyklen überstanden haben, werden zum alten Gen befördert, dh zu langlebigen Objekten, die im alten Gen untergebracht sind.
  • Permanente Generierung: 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.

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.