Java GC: Warum zwei überlebende Regionen?

Lesezeit: 8 Minuten

Benutzer-Avatar
Shrin1000

Für die JVM von Sun/Oracle habe ich gelesen, dass der GC-Algorithmus die neue Generation in eine Eden-Region und zwei Überlebensregionen unterteilt. Was ich mich frage, ist, warum zwei überlebende Regionen und nicht nur eine? Der Algo kann zwischen Eden und nur einer Region der Überlebenden hin und her pendeln (so wie er es derzeit zwischen zwei Regionen der Überlebenden tut); oder gibt es irgendwelche Mängel an diesem Ansatz?

  • Interessant – würde es Ihnen etwas ausmachen, den/die Link(s) zu posten, wo Sie darüber gelesen haben? Ich denke, das würde der Frage weiterhelfen. Bearbeiten: Dieser Artikel scheint es zu beschreiben, ich bin mir nicht sicher, ob es das gleiche ist, das Sie gelesen haben.

    – Paul Bellora

    22. Mai 2012 um 3:29 Uhr


  • Paul Bellora: nicht dieser Link an sich, aber ich habe ihn in mehreren Büchern und Artikeln gelesen. Werde diese Links demnächst posten.

    – Shrin1000

    22. Mai 2012 um 3:36 Uhr

  • @Paul Bellora Dies ist für Java 5, erwähnt jedoch die Überlebensräume “to” und “from”: oracle.com/technetwork/java/javase/…

    – Shrin1000

    24. Mai 2012 um 11:57 Uhr

  • Oh cool, danke für den Link – und nette Frage!

    – Paul Bellora

    24. Mai 2012 um 14:23 Uhr

Ich glaube, die GC-Implementierung von JRockit funktioniert eher so, wie Sie es vorschlagen, mit nur einem einzigen Eden und einem einzigen Überlebensraum, aber zitieren Sie mich nicht dazu.

Der Grund für die beiden Überlebensräume der HotSpot-JVM besteht darin, die Notwendigkeit zu verringern, mit Fragmentierung umzugehen. Neue Objekte werden im Eden-Raum zugewiesen. Alles schön und gut. Wenn das voll ist, brauchst du einen GC, also töte veraltete Objekte und verschiebe lebende in einen Überlebensraum, wo sie eine Weile reifen können, bevor sie zur alten Generation befördert werden. Bisher immer noch gut. Das nächste Mal, wenn uns der Eden-Raum ausgeht, haben wir jedoch ein Rätsel. Der nächste GC kommt daher und räumt sowohl in Eden als auch in unserem Überlebensraum etwas Platz frei, aber die Räume sind nicht zusammenhängend. Also ist es besser zu

  1. Versuchen Sie, die Überlebenden von Eden in die Löcher im Überlebensfeld zu passen, die von der GC geräumt wurden?
  2. Verschieben Sie alle Objekte im Überlebensraum nach unten, um die Fragmentierung zu beseitigen, und dann die Überlebenden hineinziehen?
  3. Sagen Sie einfach “Scheiß drauf, wir verschieben sowieso alles umher” und kopieren Sie alle Überlebenden aus beiden Räumen in einen völlig separaten Raum – den zweiten Überlebendenraum – und hinterlassen Sie so ein sauberes Eden und einen Überlebensraum, wo Sie können die Sequenz beim nächsten GC wiederholen?

Suns Antwort auf die Frage ist offensichtlich.

  • Es ist für mich nicht ersichtlich. Welche Alternative verfolgt HotSpot JVM?

    – vz0

    22. Mai 2012 um 3:46 Uhr

  • Danke für eine sehr klare und präzise Antwort. Wenn möglich, können Sie auch pl. Kommentieren Sie, welche Option JRockit verwendet?

    – Shrin1000

    22. Mai 2012 um 4:05 Uhr

  • Ich finde diese Antwort falsch – der von Ihnen beschriebene Kopieralgorithmus ist falsch. Ein Kopier-GC kopiert alle Objekte aus dem “Von”-Raum in den “Bis”-Raum. Danach tauschen beide Räume die Rollen. Das heißt, die Zuweisung neuer Objekte erfolgt immer im “Von”-Raum (während der “Bis”-Raum immer leer ist), sodass es keine Möglichkeit für Fragmentierungsprobleme gibt. Eine bessere Erklärung wäre, dass die Verwendung von 3 Leerzeichen den Speicher effizienter nutzt, wie hier beschrieben: stackoverflow.com/questions/21476348/…

    – Ascher Saban

    16. April 2015 um 9:10 Uhr


  • kann jemand mit der Option zwei (2) helfen? was bedeutet hier ‘down’ und die ganze Zeile. “Verschiebt alle Objekte im Überlebensraum nach unten, um die Fragmentierung zu beseitigen”

    – Vikash

    21. November 2017 um 10:04 Uhr

  • @Vikash. Es bedeutet im Grunde, dass GC den Mark-, Sweep- und Compact-Regeln folgen würde, um die Fragmentierung zu überwinden. In der Kompaktphase werden alle Live-Objekte zum Anfang des Überlebenden-Speichers verschoben, wobei nicht lebende Objekte zwischen dem Überlebenden-Speicher entfernt werden.

    – sich fragen

    25. April 2019 um 10:11 Uhr

Benutzer-Avatar
Neeraj Singh

Die Rolle von zwei Überlebensräumen wird nach dem Betrieb einer kleineren Garbage Collection vertauscht

Die beiden Überlebensräume. Diese enthalten Objekte, die mindestens eine kleinere Garbage Collection überstanden haben, aber eine weitere Chance erhalten haben, unerreichbar zu werden, bevor sie in die alte Generation befördert werden. Nur einer von ihnen enthält Gegenstände, während der andere die meiste Zeit unbenutzt ist.

Während des Betriebs einer kleinen Garbage Collection werden Objekte markiert, die als Müll befunden wurden. Lebende Objekte im Eden, die die Sammlung überleben, werden in den ungenutzten Überlebensraum kopiert. Lebende Objekte im genutzten Überlebensraum, die eine weitere Chance erhalten, in der jungen Generation zurückgefordert zu werden, werden ebenfalls in den ungenutzten Überlebensraum kopiert. Schließlich werden lebende Objekte im genutzten Überlebensraum, die als „alt genug“ gelten, in die alte Generation befördert.

Am Ende der kleinen Garbage Collection tauschen die beiden Überlebenden ihre Rollen. Das Eden ist völlig leer; nur ein Überlebensfeld wird verwendet; und die Belegung der alten Generation ist leicht gewachsen. Da Live-Objekte während des Betriebs kopiert werden, wird diese Art von Garbage Collector als kopierender Garbage Collector bezeichnet.

Quelle: Oben sind die Auszüge von Seite 83 von Java-Leistungvon Charlie Hunt und Binu John.

Benutzer-Avatar
Premraj

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

Eden-Raum: Neue Objekte werden im Speicherpool allokiert. Die Annahme ist, dass die meisten Objekte dereferenziert werden und bald nach ihrer Erstellung nicht mehr erreichbar sind. Nicht dereferenzierte Objekte werden vom Garbage Collector der neuen Generation in die Survivor Spaces kopiert. Sie können in einigen Sonderfällen direkt in den alten Generationspool kopiert werden.

Überlebensplätze: Diese beiden kleinen Räume bewahren die überlebenden Objekte einer Müllabfuhr der jungen Generation auf. Überlebende Objekte werden (wenig) oft von einem Überlebenden in den anderen kopiert. Dies ermöglicht es, unsere stärker dereferenzierten Objekte zu ernten.

Alte Generation: Der größte Speicherpool, der die langlebigen Objekte enthalten sollte. Objekte werden in diesen Pool kopiert, sobald sie die Überlebendenfelder verlassen.

Permanente Generation: Dieser ziemlich unbekannte Pool enthält die Informationen aller Klassen. Für die meisten Anwendungen ist keine Aufmerksamkeit erforderlich. Für einige Anwendungen mit vielen Klassen muss es möglicherweise angepasst werden. Es kann auch etwas Aufmerksamkeit erfordern, wenn die Anwendung Klassen permanent lädt und entlädt.

Weitere Vorteile:

  • Speicherfragmentierung
  • Es verbessert die GC-Leistung

Unter den folgenden Links finden Sie weitere Details, die Ihnen helfen können, mehr zu verstehen

http://www.scalingbits.com/javaprimer

http://java.sys-con.com/node/84695

Benutzer-Avatar
Ian Ringrose

Alle aktuellen Antworten sprechen von 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 „kleiner“ GC durchgeführt wird, müssen nur „neue“ Objekte gescannt werden.

Im Laufe der Jahre hat sich herausgestellt, dass es nicht ausreicht, nur „neu“ und „alt“ zu haben, und es ist gut, eine dritte Generation im „mittleren Alter“ zu haben.

Was sind die Vor- und Nachteile des Kopierens aller Instanzen einer Generation von einem Space in einen anderen im Vergleich zum Kopieren in der Reihenfolge der Speicheradressen an den Beginn des Spaces einer Generation? Das Verarbeiten von Gegenständen in der Reihenfolge würde wahrscheinlich das Hinzufügen eines zusätzlichen Zeigers pro Gegenstand erfordern, würde aber die Notwendigkeit für eines der “Überlebens”-Leerzeichen eliminieren.

Benutzer-Avatar
Vikash

Zwei Überlebende sind die Implementierung des Mark-and-Copy-Algorithmus. Diese werden in GC für die jüngere Generation verwendet. Wie von Ryan in Option 3 hier erwähnt

Geben Sie hier die Bildbeschreibung ein

Benutzer-Avatar
ASR

Heap-Speicher in Java Java-Objekte werden in einem Bereich erstellt, der als Heap-Speicher bezeichnet wird. Der Heap-Speicher wird erstellt, wenn die JVM startet, Heap-Speicher wird erhöht oder verringert, wenn eine Java-Anwendung ausgeführt wird. Wenn der Heap-Speicher voll wird, entfernt der Garbage Collector die nicht verwendeten Objekte, wodurch der Garbage Collector Platz für neue Objekte schafft.

Der Heap-Speicher ist in zwei Bereiche (oder Generationen) genannt unterteilt

1.junger Raum. 2. alter Raum.

1. Im jungen Raum gibt es Eden-Raum für neue Objekte und es gibt zwei Überlebensräume (von und bis), diese beiden Überlebensräume sind immer gleich groß.

2. Survivor Spaces werden verwendet, um Überlebensobjekte zu speichern. Wenn der Young Space voll ist, entfernt der Garbage Collector die unbenutzten Objekte, indem er eine spezielle Young Collection betreibt, in der alle Objekte, die lange genug im Young Space gelebt haben, in den befördert (verschoben) werden alter Raum, wodurch der junge Raum für mehr Objektzuordnung freigegeben wird.

3.Wenn der Eden-Raum voll ist, wird GC ausgeführt. Wenn sich Objekte in diesem Eden-Raum befinden, werden diese in den Survivor-Raum verschoben.

4. Im jungen Raum verwendet GC normalerweise einen Kopieralgorithmus, der schnell ist. Jedes Mal, wenn Überlebensobjekte in einen der Überlebensräume kopiert werden.

5.Wenn der Survivor Space voll ist, werden die restlichen Live-Objekte direkt in den alten Space kopiert.

6. Im alten Raum verwendet GC normalerweise den Mark-Compact-Algorithmus, der langsam ist, aber weniger Speicher benötigt.

7. Wenn der alte Raum voll wird, wird Müll dort gesammelt, ein Prozess, der als alte Sammlung bezeichnet wird. Im alten Raum bleiben Objekte mit langer Lebensdauer dort.

8. Out of Memory wird passieren, es gibt keinen Platz für neue Objekte, selbst GC für OLD oder Perm Teil.

9. Objekt wird während der Garbage Collection verschoben: eden -> survivor -> tenured (old space)

1228160cookie-checkJava GC: Warum zwei überlebende Regionen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy