it-swarm.com.de

Java GC: Warum zwei Überlebende-Regionen?

Für Sun/Oracle's JVM habe ich gelesen, dass der GC-Algorithmus die neue Generation in eine Eden-Region und zwei Überlebende-Regionen unterteilt. Ich frage mich, warum zwei Überlebende-Regionen und nicht nur eine? Der Algo kann weiterhin zwischen Eden und nur einer Überlebensregion pingpingen (wie es derzeit zwischen zwei Überlebensregionen geschieht); oder gibt es Mängel bei diesem Ansatz?

72
shrini1000

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

Der Grund für die beiden Überlebensbereiche der HotSpot-JVM besteht darin, die Notwendigkeit der Fragmentierung zu reduzieren. Neue Objekte werden im Eden-Bereich zugewiesen. Alles gut und gut. Wenn das voll ist, brauchst du eine GC, also töte verbrauchte Objekte und bewege lebende Objekte in einen Überlebensraum, wo sie eine Weile reifen können, bevor sie zur alten Generation befördert werden. Bis jetzt noch gut. Das nächste Mal, wenn uns der Eden-Raum ausgeht, haben wir ein Rätsel. Der nächste GC kommt und räumt sowohl in Eden als auch in unserem Überlebendenraum 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 des Überlebendenraums zu passen, die vom GC gelöscht wurden?
  2. Verschieben Sie alle Objekte im Überlebensraum nach unten, um die Fragmentierung zu beseitigen, und dann die Überlebenden hineinbewegen?
  3. Sagen Sie einfach "schraub es, wir bewegen uns sowieso alles herum" und kopieren Sie alle Überlebenden aus beiden Räumen in einen völlig separaten Raum - den zweiten Überlebendenraum - und haben so einen sauberen Bereich für Eden und Überlebende, wo Sie können Wiederholung der Sequenz auf der nächsten GC?

Die Antwort von Sun auf die Frage liegt auf der Hand.

70
Ryan Stewart

Die Rolle von zwei Überlebensräumen wird nach dem Betrieb einer kleineren Müllsammlung umgekehrt.

Die zwei Überlebensräume. Diese Objekte enthalten Objekte, die mindestens eine kleinere Müllsammlung überlebt haben, aber eine weitere Chance erhalten haben, unerreichbar zu werden, bevor sie in die alte Generation befördert werden. Nur eines davon hält Objekte, während das andere meistens ___ nicht verwendet wird.

Während des Betriebs einer kleineren Speicherbereinigung werden Objekte, die als Abfall erkannt wurden, markiert. Live-Objekte im Eden, die die Sammlung überleben, werden in den nicht verwendeten Überlebensraum kopiert. Live-Objekte in dem genutzten Überlebensraum, die in der jungen Generation eine weitere Chance zur Rückforderung erhalten, werden ebenfalls in den nicht verwendeten Überlebensraum kopiert. Schließlich werden lebende Objekte in dem Überlebendenraum, die verwendet werden und als "alt genug" angesehen werden, zur alten Generation befördert.

Am Ende der kleineren Müllsammlung tauschen die beiden Überlebendenräume die Rollen aus. Der Eden ist völlig leer; Nur ein Überlebensraum wird genutzt. und die Belegung der alten Generation ist leicht gewachsen. Da Live-Objekte während des Betriebs kopiert werden, wird dieser Garbage Collection-Typ als Garbage Collection bezeichnet.

Quelle: oben sind die Auszüge von Java Performance von Charlie Hunt und Binu John auf Seite 83.

21
Neeraj Singh

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

Eden space: Neue Objekte werden im Speicherpool zugewiesen. Die Annahme ist, dass die meisten Objekte dereferenziert werden und bald nach ihrer Erstellung unerreichbar werden. Objekte, die nicht dereferenziert wurden, werden vom Garbage Collector der neuen Generation in die Überlebensräume kopiert. Sie können in einigen speziellen Fällen direkt in den alten Generierungspool kopiert werden.

Überlebensräume: Diese beiden kleinen Räume enthalten die überlebenden Objekte einer Müllsammlung der jungen Generation. Überlebende Objekte werden für eine (geringe) Anzahl von Malen von einem Überlebenden in den anderen kopiert. Dies ermöglicht das Ernten unserer mehr dereferrierten Objekte. 

Alte Generation: Der größte Speicherpool, der die langlebigen Objekte halten soll. Objekte werden in diesen Pool kopiert, sobald sie die Überlebensräume verlassen.

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

Weitere vorteile: 

  • Speicherfragmentierung
  • Es verbessert die GC-Leistung 

Bitte finden Sie die folgenden Links, um weitere Informationen zu erhalten

http://www.scalingbits.com/javaprimer

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

3
Premraj

Alle aktuellen Antworten beziehen sich auf die Fragmentierung des Speichers. Dies ist auch ein weiterer Grund, Generationen in GC zu haben.

Die Laufzeit zeichnet alle "alten Objekte" auf, die auf "neue Objekte" verweisen. Dies erfolgt jedes Mal, wenn ein "Zeiger" -Feld aktualisiert wird. Wenn dann eine Miner-GC erstellt wurde, müssen nur „neue“ Objekte gescannt werden.

Im Laufe der Jahre hat sich herausgestellt, dass nur "Neues" und "Altes" nicht ausreichen, und es ist gut, eine dritte Generation zu haben, die "im mittleren Alter" ist.

2
Ian Ringrose

Welche Vor- und Nachteile hat es, alle Instanzen einer Generation von einem Speicherplatz in einen anderen zu kopieren, statt sie in Speicheradressenreihenfolge an den Beginn eines Generationsraums 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 Verwendung eines der 'Überlebenden'-Leerzeichen überflüssig machen.

1
supercat

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

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

1. junger raum. 2.alter raum.

1.Im jungen Raum gibt es Eden Platz für neues Objekt und es gibt zwei Überlebensräume (von und bis). Diese beiden Überlebensräume haben immer die gleiche Größe.

2.Überlebensräume werden zum Speichern von Überlebensobjekten verwendet. Wenn der junge Raum voll ist, entfernt der Garbage Collection-Sammler die ungenutzten Objekte, indem er eine spezielle junge Sammlung ausführt, in der alle Objekte, die lange genug im jungen Raum gelebt haben, in den Computer befördert werden alter Raum, wodurch der junge Raum für mehr Objektzuordnung frei wird.

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

4.In einem jungen Raum verwendet GC normalerweise einen Kopieralgorithmus, der schnell ist. Jedes Mal, wenn Objekte überleben, werden Objekte in einen der Survivor Space kopiert.

5.Wenn der Survivor Space voll ist, werden restliche Live-Objekte direkt in den Old Space kopiert.

6.Im alten Raum wird GC normalerweise nur mit dem Mark-Compact-Algorithmus verwendet, der langsam ist, jedoch weniger Speicher benötigt.

7. Wenn der alte Speicherplatz voll ist, wird der gesamte Müll gesammelt, ein Vorgang, der als alte Sammlung bezeichnet wird. Im alten Speicherbereich bleiben Objekte, die lange leben.

8.Out of Memory wird passieren, es ist kein Platz für neue Objekte vorhanden, auch wenn für den ALD- oder Perm-Teil keine GC erstellt wurde.

9. Objekt wird während der Garbage Collection verschoben: eden -> Überlebende -> vermietet (alte Fläche)

0
ASR

Zwei Überlebende sind die Implementierung eines Markierungs- und Kopieralgorithmus. Diese werden in der GC für die jüngere Generation verwendet. Wie von Ryan in Option 3 erwähnt hier

enter image description here

0
Vikash