362 Stimmen

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

Ich versuche zu verstehen, was die Konzepte von junge , ancien y bleibende Generationen sind in der Java-Heap-Terminologie, und zwar die Interaktionen zwischen den drei Generationen.

Meine Fragen sind:

  • Was ist die junge Generation?
  • Was ist die alte Generation?
  • Was ist die ständige Generation?
  • Wie interagieren die drei Generationen bzw. wie verhalten sie sich zueinander?

337voto

Joshua McKinnon Punkte 24044

Dies scheint ein häufiges Missverständnis zu sein. In der JVM von Oracle ist die permanente Erzeugung nicht Teil des Heaps. Sie ist ein separater Bereich für Klassendefinitionen und zugehörige Daten. In Java 6 und früher wurden internierte Strings auch in der permanenten Generation gespeichert. In Java 7 werden internierte Strings im Hauptobjekt-Heap gespeichert.

Hier ist ein guter Beitrag über permanente Erzeugung .

Mir gefallen die Beschreibungen, die für jeden Raum in Oracle's Anleitung zu JConsole :

Für die HotSpot Java VM wird der Speicher Pools für die serielle Garbage Collection sind die folgenden.

  • Eden Space (Haufen): Der Pool, aus dem Speicher anfänglich zugewiesen wird für die meisten Objekte.
  • Survivor Space (Haufen): Der Pool, der die Objekte enthält, die die die Garbage Collection des Eden Raum.
  • Tenured Generation (Haufen): Der Pool, der Objekte enthält, die bereits seit einiger Zeit seit einiger Zeit im Survivor Space existieren.
  • Ständige Erzeugung (ohne Haufen): Der Pool, der alle reflektierenden Daten der virtuellen Maschine selbst, wie z.B. Klassen- und Methodenobjekte. Bei Java VMs, die Class Data Sharing verwenden, wird diese Generation unterteilt in schreibgeschützte und schreibgeschützte Bereiche.
  • Code-Cache (nicht Heap): Die HotSpot Java VM enthält auch einen Code-Cache, der Speicher enthält, der verwendet wird für Kompilierung und Speicherung von nativem Code dient.

Java verwendet eine generative Garbage Collection. Das bedeutet, dass ein Objekt foo (das eine Instanz einer Klasse ist) umso weiter befördert wird, je mehr Garbage-Collection-Ereignisse es überlebt (falls es noch Referenzen darauf gibt). Es beginnt in der jungen Generation (die ihrerseits in mehrere Bereiche unterteilt ist - Eden und Survivor) und würde schließlich in der etablierten Generation landen, wenn es lange genug überlebt.

229voto

Premraj Punkte 65511

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

Junge Generation : Es ist ein Ort, an dem man für kurze Zeit wohnt und der in zwei Räume unterteilt ist:

  • Eden (Adam und Eva lebten zuerst) Raum : Wenn ein Objekt mit dem Schlüsselwort new erstellt wird, wird Speicher zugewiesen in diesem Bereich.
  • Survivor Raum : 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 hauptsächlich festangestellte und virtuelle (reservierten) Speicherplatz und enthält die Objekte, die nach der Garbage Collection von Young Generation.

  • Gemieteter Raum: Dieser Speicherpool enthält Objekte, die nach mehrfacher Garbage Collection überlebt haben, d.h. Objekte, die nach der Garbage Collection aus dem Survivor Space überlebt haben.

Ständige Generation : Dieser Speicherpool enthält, wie der Name schon sagt, permanente Klassen-Metadaten und Deskriptoren, so dass der PermGen-Speicherplatz immer für Klassen und solche, die an die Klassen gebunden sind, z.B. statische Mitglieder, reserviert ist.

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

Code-Cache (Virtuell oder reserviert) : Wenn Sie HotSpot Java VM verwenden, umfasst dies den Code-Cache-Bereich, der Speicher enthält, der für die Kompilierung und Speicherung von nativem Code verwendet wird.

enter image description here

Mit freundlicher Genehmigung

60voto

Ravindra babu Punkte 45577

Was ist die junge Generation?

Les Junge Generation ist der Ort, an dem alle neuen Objekte zugewiesen und gealtert werden. Wenn die junge Generation voll ist, führt dies zu einer kleinen Garbage Collection. Eine junge Generation voller toter Objekte wird sehr schnell eingesammelt. Einige überlebende Objekte werden gealtert und gehen schließlich in die alte Generation über.

Was ist die alte Generation?

Les Alte Generation wird verwendet, um lange überlebende Objekte zu speichern. In der Regel wird für Objekte der jungen Generation ein Schwellenwert festgelegt, und wenn dieses Alter erreicht ist, wird das Objekt in die alte Generation verschoben. Irgendwann muss die alte Generation abgeholt werden. Dieses Ereignis wird als Major Garbage Collection

Was ist die ständige Generation?

Les Permanente Erzeugung enthält Metadaten, die von der JVM benötigt werden, um die in der Anwendung verwendeten Klassen und Methoden zu beschreiben. Die permanente Generierung wird von der JVM zur Laufzeit auf der Grundlage der von der Anwendung verwendeten Klassen ausgefüllt.

PermGen wurde seit der Veröffentlichung von Java 8 durch Metaspace ersetzt.

PermSize & MaxPermSize Parameter werden nun ignoriert

Wie interagieren die drei Generationen bzw. wie verhalten sie sich zueinander?

enter image description here

Bildquelle & Oracle Technetwork-Tutorial-Artikel: http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html

" Der allgemeine Garbage Collection Prozess "In dem oben genannten Artikel werden die Wechselwirkungen zwischen ihnen mit vielen Diagrammen erläutert.

Sehen Sie sich das Übersichtsdiagramm an:

enter image description here

19voto

Mark R Punkte 416

Die virtuelle Java-Maschine ist in drei Generationen unterteilt: eine junge Generation, eine alte Generation und eine permanente Generation. Die meisten Objekte werden zunächst der jungen Generation zugeordnet. Die alte Generation enthält Objekte, die eine gewisse Anzahl von Sammlungen der jungen Generation überlebt haben, sowie einige große Objekte, die direkt in der alten Generation zugewiesen werden können. Die permanente Generation enthält Objekte, deren Verwaltung durch den Garbage Collector für die JVM sinnvoll ist, z. B. Objekte, die Klassen und Methoden beschreiben, sowie die Klassen und Methoden selbst.

4voto

KrityAg Punkte 71

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

  • Junge Generation: Die neu erstellten Objekte werden der jungen Generation zugewiesen.
  • Alte Generation: Wenn das neue Objekt einen größeren Heap-Speicherplatz anfordert, wird es direkt der alten Generation zugeordnet. Auch Objekte, die ein paar GC-Zyklen überlebt haben, werden in die alte Generation befördert, d.h. langlebige Objekte werden in der alten Generation untergebracht.
  • Permanente Generierung: Die permanente Generierung enthält Objekte, die die JVM für die Verwaltung durch den Garbage Collector für geeignet hält, 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 bzw. wie verhalten sie sich zueinander? Die Objekte (außer den großen) werden zuerst der jungen Generation zugeteilt. Wenn ein Objekt nach x Garbage Collection-Zyklen noch am Leben ist, wird es in die alte/beständige Generation befördert. Daher kann man sagen, dass die junge Generation die kurzlebigen Objekte enthält, während die alte Generation die Objekte mit einer langen Lebensdauer enthält. Die permanente Generation interagiert nicht mit den anderen beiden Generationen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X