Für Sun/Oracles JVM habe ich gelesen, dass der GC Algo die neue Generation in eine Eden-Region und zwei Überlebende unterteilt. Ich frage mich, warum zwei Regionen der Überlebenden und nicht nur eine? Der Algo kann zwischen Eden und nur einer Überlebenden-Region ping-pong halten (wie es derzeit zwischen zwei Überlebenden-Regionen geschieht); oder gibt es Mängel in diesem Ansatz?Java GC: Warum zwei Überlebende Regionen?
Antwort
Ich glaube, die GC-Implementierung von JRockit funktioniert mehr wie Sie vorschlagen, mit nur einem einzigen Eden und Single Survivor Space, aber zitieren Sie mich nicht darauf.
Der Grund für die beiden Survivor-Spaces von HotSpot JVM ist, die Notwendigkeit der Fragmentierung zu reduzieren. Neue Objekte werden im Eden Space zugewiesen. Alles gut und gut. Wenn das voll ist, brauchst du einen GC, also töte veraltete Objekte ab und bewege lebende in einen Überlebendenraum, wo sie eine Weile reifen können, bevor sie zur alten Generation befördert werden. Bis jetzt noch gut. Das nächste Mal, wenn wir den eden-Raum verlassen, haben wir ein Rätsel. Der nächste GC kommt und räumt sowohl in eden als auch in unserem Survivorspace etwas Raum frei, aber die Räume sind nicht zusammenhängend. Also ist es besser,
- Versuchen Sie, die Überlebenden von Eden in die Löcher im Überlebenden Raum passen, die von der GC gelöscht wurden?
- Verschieben Sie alle Objekte im Survivor-Space nach unten, um die Fragmentierung zu entfernen, und dann die Überlebenden hineinziehen?
- Sag einfach "schraube es, wir bewegen sowieso alles herum" und kopiere alle Überlebenden aus beiden Räumen in einen völlig separaten Raum - den zweiten Überlebendenraum - und hinterlässt dir damit einen sauberen Eden- und Überlebendenraum Wo können Sie die Sequenz auf dem nächsten GC wiederholen?
Suns Antwort auf die Frage ist offensichtlich.
Es ist nicht offensichtlich für mich. Welche Alternative verfolgt HotSpot JVM? – vz0
Danke für eine sehr klare und präzise Antwort. Wenn möglich, können Sie auch pl. Kommentar zu welcher Option JRockit verwendet? – shrini1000
@ vz0: es ist die dritte Option. – shrini1000
Welche Vor- und Nachteile hat es, alle Instanzen einer Generation von einem Bereich in einen anderen zu kopieren, anstatt sie in der Reihenfolge der Speicheradressen an den Anfang des Speicherbereichs einer Generation zu kopieren? Die Verarbeitung von Elementen in der Reihenfolge würde wahrscheinlich das Hinzufügen eines zusätzlichen Zeigers pro Element erfordern, würde jedoch die Notwendigkeit für eines der "Überlebenden" -Zwischenräume beseitigen.
Die Rolle der beiden Survivor Spaces wird nach der Operation einer kleineren Garbage Collection umgekehrt
Die beiden Survivor Spaces. Diese enthalten Objekte, die mindestens eine geringfügige Speicherbereinigung überstanden haben, denen jedoch eine weitere Chance geboten wurde, unerreichbar zu werden, bevor sie zur alten Generation befördert werden. Nur einer von ihnen hält Objekte, während der andere die meiste Zeit unbenutzt ist.
Während der Ausführung einer unbedeutenden Speicherbereinigung werden Objekte, die als unbrauchbar eingestuft wurden, markiert. Live-Objekte in den Eden, die die Sammlung überleben, werden in den nicht verwendeten Überlebendenbereich kopiert. Live-Objekte im Survivor Space, die verwendet werden, die eine weitere Chance erhalten, in der jungen Generation zurückerobert zu werden, werden ebenfalls in den ungenutzten Survivor Space kopiert. Schließlich werden lebende Objekte in dem Überlebendenraum, die verwendet werden, die als "alt genug" betrachtet werden, zu der alten Generation befördert.
Am Ende der Minor Garbage Collection tauschen die beiden Survivor Spaces die Rollen. Der Eden ist völlig leer; nur ein Überlebendenraum ist in Benutzung; und die Belegung der alten Generation ist leicht gewachsen. Da Live-Objekte während der Operation kopiert werden, wird diese Art von Garbage Collector als Garbage Collector bezeichnet.
Quelle: oben sind die Auszüge von Seite 83 von Java Performance, von Charlie Hunt und Binu John.
Young Generation: Es ist Ort, wo für kurze Zeit und in zwei Räume unterteilt gelebt:
Eden Raum: Neue Objekte werden in dem Speicherpool zugeordnet werden. Die Annahme ist, dass die meisten Objekte kurz nach ihrer Erstellung dereferenziert und unerreichbar werden. Objekte, die nicht dereferenziert werden, werden vom Garbage Collector der neuen Generation in die Survivor Spaces kopiert. Sie können in einigen speziellen Fällen direkt in den Pool der alten Generation kopiert werden.
Überlebende Räume: Diese zwei kleinen Räume halten die überlebenden Objekte einer Müllabfuhr der jungen Generation. Überlebende Objekte werden für eine (kleine) Anzahl von einem Überlebenden in den anderen kopiert. Dies ermöglicht es, unsere mehr dereferenzierten Objekte zu ernten.
Alte Generation: Der größte Speicherpool, der die langlebigen Objekte behalten soll. Objekte werden in diesen Pool kopiert, sobald sie die Überlebenden verlassen haben.
Permalserzeugung: Dieser ziemlich unbekannte Pool enthält die Informationen aller Klassen. Es benötigt für die meisten Anwendungen keine Aufmerksamkeit. Es muss möglicherweise für einige Anwendungen mit vielen Klassen angepasst werden. Es kann auch etwas Aufmerksamkeit erfordern, wenn die Anwendung Klassen dauerhaft lädt und entlädt.
Weitere Vorteile:
- Speicherfragmentierung
- Es GC Leistung verbessert
Bitte finden Sie die folgenden Links, um weitere Informationen, die Ihnen helfen mehr
verstehenAlle aktuellen Antworten sprechen über Speicherfragmentierung, dies ist auch ein weiterer Grund, Generationen in GC zu haben.
Die Laufzeit zeichnet alle "alten Objekte" auf, die auf "neue Objekte" zeigen, dies geschieht jedes Mal, wenn ein "Zeiger" -Feld aktualisiert wird. Wenn dann ein "Miner" -GC durchgeführt wird, müssen nur "neue" Objekte gescannt werden.
Im Laufe der Jahre wurde festgestellt, dass nur "neu" und "alt" nicht genug ist, und es ist gut, eine 3. Generation zu haben, die "mittleren Alters" ist.
Zwei Überlebende sind Implementierung von Mark-and-Copy-Algorithmus. Diese werden in GC für jüngere Generationen verwendet. Wie in Option von Ryan erwähnt 3 here
Interessant - möchten Sie den Link etwas ausmachen Posting (n), wo Sie das lesen? Ich denke, das würde der Frage helfen. ** Edit: ** [diesen Artikel] (http://javarevisited.blogspot.com/2011/04/garbage-collection-in-java.html) scheint es zu beschreiben, nicht sicher, ob es das gleiche ist, das Sie gelesen haben. –
Paul Bellora: nicht dieser Link pro sagen, aber ich habe es in mehreren Büchern und Artikeln gelesen. Werde diese Links bald posten. – shrini1000
@Paul Bellora Dies ist für Java 5, aber es erwähnt "bis" und "von" Survivior Räume: http://www.oracle.com/technetwork/java/javase/memorymanagement-whitepaper-150215.pdf – shrini1000