Heim  >  Artikel  >  Web-Frontend  >  Eine kurze Analyse des Heap- und Garbage-Collection-Mechanismus

Eine kurze Analyse des Heap- und Garbage-Collection-Mechanismus

hzc
hzcnach vorne
2020-07-03 09:20:081840Durchsuche

In diesem Artikel konzentrieren wir uns hauptsächlich auf folgende Themen:: Wann werden die Objekte im Heap recycelt, nachdem das Java-Programm ausgeführt wurde? Wie recyceln?

Der Heap wird auch „GC-Heap“ genannt. Da Collectors jetzt grundsätzlich Generations-Collection-Algorithmen verwenden, kann der Java-Heap auch unterteilt werden in: neue Generation und alte Generation. Das Verhältnis beträgt 1:2; genauer gesagt ist die neue Generation in Eden-Bereich und Survivor-Bereich unterteilt, und das Verhältnis beträgt 8:1. Die folgende Abbildung zeigt die Struktur des Heaps:

Die Speicherzuweisung für Objekte im Heap beträgt Die Strategie ist streng geregelt:

  • Objekte weisen zuerst Speicher im Eden-Bereich der neuen Generation zu; > Große Objekte gelangen direkt in die alte Generation, hauptsächlich lange Zeichenfolgen und Arrays, die viel kontinuierlichen Speicherplatz erfordern

  • Langfristiges Überleben Objekte treten in die alte Generation ein. Wenn der Speicher im Eden-Bereich nicht ausreicht, initiiert die JVM einen MinorGC und das Alter des Objekts wird um eins erhöht. Das Standardalter des Objekts erreicht 15 und tritt in das Alter ein >

  • Dynamische Altersbestimmung. Die Summe der Größen aller Objekte desselben Alters ist größer als die Hälfte des Survivor-Raums. Objekte, die größer oder gleich diesem Alter sind, gelangen in die alte Generation
  • Der GC der neuen Generation bezieht sich auf den Minor GC, der in der neuen Generation häufig und schnell durchgeführt wird. GC der alten Generation (Major GC/Full GC) führt die Speicherbereinigung der alten Generation durch, normalerweise begleitet von mindestens einem kleineren GC. Langsam. In den folgenden Situationen wird eine vollständige GC ausgelöst:

    Unzureichender Platz in der alten Generation;

Unzureichender Platz im Methodenbereich; >

  1. Rufen Sie System.gc() auf. Es wird empfohlen, dass die JVM eine vollständige GC durchführt -Term erhaltene Objekte der alten Generation, unzureichender Platz

  2. Es ist nicht genügend zusammenhängender Platz für große Objekte vorhanden;

  3. Es gibt zu viele Objekte, die die Garbage Collection in der neuen Generation überleben, und S1 kann sie nicht unterbringen. Der garantierte Platz in der alten Generation reicht nicht aus. Der garantierte Platz bezieht sich darauf, ob der maximal verfügbare Platz kontinuierlich ist Der Raum in der alten Generation ist größer als der Gesamtraum aller Objekte in der neuen Generation.

  4. Fast alle Objekte werden auf dem Heap abgelegt. Woher wissen wir also, ob diese Objekte noch nützlich sind? Die JVM bietet zwei Methoden zur Bestimmung:

  5. Referenzzählmethode

  6. : Das Objekt Fügt einen Referenzzähler hinzu, der um eins erhöht wird. Wenn die Referenz ungültig wird, verringert sich der Zählerwert um eins. Dies bedeutet, dass das Objekt nicht aktiv ist. Die Referenzzählmethode kann das Zirkelverweisproblem nicht lösen. Es gibt detaillierte Beispiele im Buch von Lehrer Zhou Zhipeng, das relativ leicht zu verstehen ist.

  • Methode zur Barrierefreiheitsanalyse : Nehmen Sie das „GC Roots“-Objekt als Ausgangspunkt, genau wie den Wurzelknoten eines Baums, und suchen Sie nach unten. Der von der Suche zurückgelegte Pfad wird als Referenzkette bezeichnet Punkt von GC Roots, dann ist dies Das Objekt ist nicht erreichbar und muss recycelt werden. GC Roots bezieht sich auf Objekte, auf die durch den Stapel der virtuellen Maschine verwiesen wird, auf Objekte, auf die durch den Stapel lokaler Methoden verwiesen wird, auf Objekte, auf die durch statische Eigenschaften im Methodenbereich verwiesen wird, und auf Objekte, auf die durch Konstanten im Methodenbereich verwiesen wird.

  • Wie oben erwähnt, hängt das Überleben von Objekten mit Referenzen zusammen. Referenztypen werden in starke Referenzen, weiche Referenzen, schwache Referenzen und virtuelle Referenzen unterteilt.

Starke Referenz, neues Objekt, der Müllsammler wird es niemals recyceln Weiche Referenzen: Der Speicher dieser Objekte wird recycelt, bevor OMM im System auftritt.

Schwache Referenzen, sobald der Garbage Collector sie findet Funktioniert, es wird sofort recycelt ;

  • Dummy-Referenz ist nutzlos und kann jederzeit recycelt werden.

Tatsächlich werden nicht erreichbare Objekte, die durch die Erreichbarkeitsanalysemethode ermittelt wurden, nicht sofort recycelt. Das Objekt muss vorher zweimal mit markiert werden es wird tatsächlich recycelt . Die erste Markierung besteht darin, als nicht erreichbares Objekt zu beurteilen und dann eine Filterung durchzuführen. Die Filterbedingung besteht darin, ob die finalize()-Methode für dieses Objekt ausgeführt werden muss . Wenn die finalize()-Methode nicht überschrieben wird oder die finalize()-Methode von der virtuellen Maschine aufgerufen wurde, wird die finalize()-Methode vom System nur einmal aufgerufen. In beiden Fällen besteht „keine Notwendigkeit zur Ausführung“. Bei Bedarf wird dieses Objekt in die Warteschlange F-Quene gestellt, eine mit niedriger Priorität, die automatisch von der virtuellen Maschine erstellt wird FinalizerDer Thread führt die finalize()-Methode aus. Während dieser Zeit führt der GC eine zweite kleine Markierung an den Objekten in F-Quene durch. Wenn das Objekt immer noch nicht referenziert ist, wird dies der Fall sein Objekte, die nicht gefiltert werden, werden nicht unbedingt recycelt.

Wir wissen bereits, was das ist Objekt ist Zeit wurde recycelt, also wie kann man es recyceln? Wir stellen die vier am häufigsten verwendeten Garbage-Collection-Algorithmen vor:

  • Mark-clear: Markieren Sie die Objekte, die zuerst gelöscht werden müssen, und recyceln Sie sie dann einheitlich – nicht effizient , wird eine große Anzahl diskontinuierlicher Fragmente erzeugen;

  • Kopieralgorithmus: Teilen Sie den Speicher in Blöcke auf und verwenden Sie jeweils nur ein Stück überlebende Objekte zu einem anderen Auf einem Stück

  • Markieren und Sortieren: Markieren Sie zuerst die überlebenden Objekte, verschieben Sie dann alle überlebenden Objekte an ein Ende und räumen Sie sie direkt auf der Speicher außerhalb der Endgrenze; ​​

  • Der Heap wird in neue und alte Generationen unterteilt Generation gesammelt wird, wählen Sie daher den Kopieralgorithmus. Die Überlebensrate der alten Generation ist relativ hoch und es gibt keinen zusätzlichen Platz für die Zuweisungsgarantie. Wählen Sie daher den Algorithmus zum Löschen von Markierungen oder zum Sortieren von Markierungen.

Der Garbage-Collection-Algorithmus ist eine Idee des Speicherrecyclings, und die spezifische Implementierung ist ein Garbage Collector. Eine kurze Einführung in häufig verwendete Müllsammler:

  • serieller Seriensammler. Einzelner Thread, andere Arbeiten müssen während der Speicherbereinigung angehalten werden. Kopieren für neue Schüler, Markieren und Sortieren für alte Schüler. Einfach und effizient;

  • ParNew Sammler. Multithread-Version von Serial;

  • Parallel Scavenge Collector, ein Multithread-Collector von Kopieralgorithmus. Achten Sie auf den Durchsatz, die Ausführungszeit des CPU-Codes / die insgesamt aufgewendete CPU-Zeit. Kopie der neuen Generation, Sortierung der Marke der alten Generation; Parallel Old Collector, die alte Generation von Parallel Scavenge

  • CMS Collector, der sich auf die kürzeste Pause konzentriert. Bei einem gleichzeitigen Collector arbeitet der Garbage-Collection-Thread (im Grunde) gleichzeitig mit dem Benutzer-Thread. Mark-and-Sweep-Algorithmus

  • Weitere Einzelheiten zum Garbage Collector finden Sie im Buch von Herrn Zhou Zhipeng.
  • Empfohlenes Tutorial: „

    JS-Tutorial

Das obige ist der detaillierte Inhalt vonEine kurze Analyse des Heap- und Garbage-Collection-Mechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Nexttick-Prinzip in VueNächster Artikel:Nexttick-Prinzip in Vue