Heim Java javaLernprogramm Detaillierte Erläuterung der Markierung recycelter Objekte in Java und des sekundären Markierungsprozesses von Objekten

Detaillierte Erläuterung der Markierung recycelter Objekte in Java und des sekundären Markierungsprozesses von Objekten

Oct 11, 2017 am 10:12 AM
java 标记

Dieser Artikel stellt hauptsächlich den relevanten Inhalt der Markierung von Java-Recyclingobjekten und den sekundären Markierungsprozess von Objekten vor. Ich werde ihn hier mit Ihnen teilen.

1. Markierung von Gegenständen

1. Was ist eine Markierung? Wie markieren?

Ich glaube, jeder weiß, dass die erste Frage darin besteht, einige tote Gegenstände zu markieren, um die Reinigung des Müllsammlers zu erleichtern. Für die Markierung gibt es im Allgemeinen zwei Methoden: Referenzzählung und Erreichbarkeitsanalyse.

Die Referenzzählung ist relativ einfach zu implementieren. Sie besteht darin, dem Objekt einen Referenzzähler hinzuzufügen, der um 1 erhöht wird wird um 1 dekrementiert. Wenn der Zähler 0 ist, wird er zum Recycling markiert. Dieses Urteil ist sehr effizient, aber viele gängige virtuelle Maschinen verwenden diese Methode nicht, hauptsächlich weil es schwierig ist, das Problem der Zirkelverweise zwischen mehreren Objekten zu lösen. Obwohl sie nicht oft verwendet wird, lohnt es sich dennoch, sie zu lernen!


public class Test {
private Object obj;
Public static void main(){
Test t1=new Test();
Test t2=new Test();
t1.obj=t2;
t2.obj=t1;
t1=null;
t2=null;
//如果对象在这行发生gc,那么t1和t2对象是否能被回收
System.gc();
}
}
Nach dem Login kopieren

Die Grundidee der Erreichbarkeitsanalyse ist: Beginnen Sie die Suche von diesen Knoten aus, indem Sie einige Objekte namens „GC Roots“ als Ausgangspunkt verwenden Suchen Sie nach Objekten, die eine direkte oder indirekte Referenzbeziehung zum Knoten haben, und kombinieren Sie diese Objekte in Form von Ketten zu einem „Beziehungsnetzwerk“, auch Referenzkette genannt. Schließlich sammelt der Garbage Collector einige Objekte, die sich nicht in diesem Beziehungsnetzwerk befinden. Wie im Bild gezeigt:

Das mit dem GC Roots-Objekt verbundene Objekt ist definitiv ein lebendiges Objekt, und das Würfelobjekt auf der rechten Seite hat nichts mit GCROOTS zu tun, daher wird es markiert als wiederverwertbares Objekt. Derzeit verwenden gängige kommerzielle virtuelle Maschinen ähnliche Methoden. Welche Objekte können also als „GC Roots“ verwendet werden? In Java gibt es vier Arten von Objekten, die als Referenzobjekte in „GC Roots“ verwendet werden können

1: Stapelrahmen (Substantiv in Kapitel 1). (Im Stapel)

2: Objekt, auf das durch statische Eigenschaften verwiesen wird. (Im Methodenbereich)

3: Objekt, auf das durch eine Konstante verwiesen wird. (Im Methodenbereich)

4: Von JNI referenziertes Objekt im lokalen Methodenstapel. (Im lokalen Methodenstapel)

2. Sekundäres Recycling von Objekten

Ich habe gesagt, dass das Objekt markiert ist, aber das ist nicht der Fall bedeutet, dass es gekennzeichnet ist. Wird es definitiv recycelt? Ich weiß nicht, ob ihr euch daran erinnert, dass die Object-Klasse eine finalize()-Methode hat. Alle Klassen erben die Object-Klasse, daher ist diese Methode standardmäßig implementiert.

Das Funktionsprinzip von Finalize sollte wie folgt aussehen: Sobald der Garbage Collector bereit ist, den vom Objekt belegten Speicherplatz freizugeben, ruft er zuerst finalize() auf und erst beim nächsten Garbage Collection-Prozess , wird es wirklich den Speicher des Objekts zurückgewinnen? Wenn Sie finalize() verwenden, können Sie während der Garbage Collection einige wichtige Aufräumarbeiten durchführen.
Wann wird finalize() aufgerufen?

Es gibt drei Situationen

1. Alle Objekte werden automatisch aufgerufen, wenn sie Garbage Collection sind, beispielsweise wenn System.gc() ausgeführt wird.

2. Das Programm wird beendet. Die finalize-Methode wird einmal für jedes Objekt aufgerufen.

3. Rufen Sie explizit die finalize-Methode auf

Der Zweck dieser Methode ist: Bevor das Objekt recycelt wird, wird die finalize()-Methode des Objekts aufgerufen . Das Recycling bezieht sich hier auf nach der Markierung. Das Problem liegt darin, dass sich ein Objekt nicht mehr im im vorherigen Kapitel erwähnten „Beziehungsnetzwerk“ (Referenzkette) befindet, sondern nach dem Umschreiben durch den Entwickler () und das Objekt erneut zum „Beziehungsnetzwerk“ hinzugefügt, das heißt, das Objekt ist für uns immer noch nützlich und sollte nicht recycelt werden, aber es wurde markiert.

Um dieses Problem anzugehen, besteht der Ansatz der virtuellen Maschine darin, Objekte zweimal zu markieren, also Objekte zu markieren, die sich nicht zum ersten Mal im „Beziehungsnetzwerk“ befinden. Beim zweiten Mal muss zunächst festgestellt werden, ob das Objekt die Methode finalize () implementiert hat. Wenn sie nicht implementiert wurde, wird direkt festgestellt, dass das Objekt recycelbar ist Zuerst wird es in eine Warteschlange gestellt, und ein von der virtuellen Maschine erstellter Prioritätsthread führt es aus, und dann wird eine zweite kleine Markierung durchgeführt. Dieses Mal wird das markierte Objekt tatsächlich recycelt.

Zusammenfassung: Vereinfacht ausgedrückt wird das Objekt zum ersten Mal markiert und die finalize()-Methode des Objekts wird vor dem nächsten GC ausgeführt. Bei der Ausführung der finalize()-Methode wird beurteilt, ob das Objekt die finalize()-Methode implementiert hat. Wenn sie nicht implementiert ist, wird sie direkt gelöscht. Wenn sie implementiert ist, wird das Objekt in eine Warteschlange gestellt, um die finalize()-Methode auszuführen und zum zweiten Mal markiert
im Java-Root-Suchalgorithmus Um die Erreichbarkeit von Objekten zu ermitteln, müssen nicht erreichbare Objekte nicht unbedingt bereinigt werden. Zu diesem Zeitpunkt gibt es eine Probezeit. Um wirklich beurteilen zu können, dass ein Objekt tot ist, muss es mindestens zwei Markierungsprozesse durchlaufen: Wenn das Objekt nach einer Root-Suche feststellt, dass keine Referenzkette mit GC-Wurzeln verknüpft ist, wird dies der Fall sein Zum ersten Mal markieren und nach dem Filtern ist die Filterbedingung, ob dieses Objekt die finalize()-Methode ausführen muss Wenn das Objekt die finalize()-Methode nicht abdeckt, oder die finalize()-Methode wurde von der virtuellen Maschine aufgerufen, die virtuelle Maschine wird in allen Fällen als „Es besteht keine Notwendigkeit, auszuführen“ betrachtet.

Das heißt, wenn ein Objekt die finalize()-Methode überschreibt, wird beurteilt, dass das Objekt zur Ausführung der finalize()-Methode erforderlich ist, dann wird das Objekt in die F-Warteschlange gestellt und Es wird später von einem Finalizer-Thread mit niedriger Priorität ausgeführt, der automatisch von der virtuellen Maschine erstellt wird. Die sogenannte Ausführung bedeutet hier, dass die virtuelle Maschine diese Methode startet, aber nicht verspricht, zu warten, bis die Ausführung abgeschlossen ist. Der Grund dafür: Wenn ein Objekt in der finalize()-Methode langsam ausgeführt wird oder eine Endlosschleife auftritt (im Extremfall), kann dies dazu führen, dass sich andere Objekte in der F-Queue-Warteschlange dauerhaft im Wartezustand befinden oder sogar dazu führen Der gesamte Speicher bis zum Recyclingsystem stürzt ab. Die finalize()-Methode ist die letzte Chance für das Objekt, dem Schicksal des Todes zu entgehen. Später markiert der GC das Objekt in der F-Warteschlange für einen zweiten kleinen Maßstab, wenn das Objekt sich erfolgreich in finalize() speichern möchte. ----Solange Sie es einfach erneut mit irgendetwas in der Referenzkette verknüpfen, wird es aus der Sammlung „kurz vor der Wiederverwertung“ entfernt, wenn es zum zweiten Mal markiert wird, wenn das Objekt dabei nicht entkommt Zeit wird es recycelt. Codebeispiel: Weitere Informationen finden Sie im entsprechenden Kapitel von „Ausführliches Verständnis der Java Virtual Machine“

Zusammenfassung

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Markierung recycelter Objekte in Java und des sekundären Markierungsprozesses von Objekten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Quadratwurzel in Java Quadratwurzel in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Quadratwurzel in Java. Hier diskutieren wir anhand eines Beispiels und seiner Code-Implementierung, wie Quadratwurzel in Java funktioniert.

Perfekte Zahl in Java Perfekte Zahl in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur perfekten Zahl in Java. Hier besprechen wir die Definition, Wie prüft man die perfekte Zahl in Java?, Beispiele mit Code-Implementierung.

Zufallszahlengenerator in Java Zufallszahlengenerator in Java Aug 30, 2024 pm 04:27 PM

Leitfaden zum Zufallszahlengenerator in Java. Hier besprechen wir Funktionen in Java anhand von Beispielen und zwei verschiedene Generatoren anhand ihrer Beispiele.

Weka in Java Weka in Java Aug 30, 2024 pm 04:28 PM

Leitfaden für Weka in Java. Hier besprechen wir die Einführung, die Verwendung von Weka Java, die Art der Plattform und die Vorteile anhand von Beispielen.

Armstrong-Zahl in Java Armstrong-Zahl in Java Aug 30, 2024 pm 04:26 PM

Leitfaden zur Armstrong-Zahl in Java. Hier besprechen wir eine Einführung in die Armstrong-Zahl in Java zusammen mit einem Teil des Codes.

Smith-Nummer in Java Smith-Nummer in Java Aug 30, 2024 pm 04:28 PM

Leitfaden zur Smith-Zahl in Java. Hier besprechen wir die Definition: Wie überprüft man die Smith-Nummer in Java? Beispiel mit Code-Implementierung.

Fragen zum Java Spring-Interview Fragen zum Java Spring-Interview Aug 30, 2024 pm 04:29 PM

In diesem Artikel haben wir die am häufigsten gestellten Fragen zu Java Spring-Interviews mit ihren detaillierten Antworten zusammengestellt. Damit Sie das Interview knacken können.

Brechen oder aus Java 8 Stream foreach zurückkehren? Brechen oder aus Java 8 Stream foreach zurückkehren? Feb 07, 2025 pm 12:09 PM

Java 8 führt die Stream -API ein und bietet eine leistungsstarke und ausdrucksstarke Möglichkeit, Datensammlungen zu verarbeiten. Eine häufige Frage bei der Verwendung von Stream lautet jedoch: Wie kann man von einem Foreach -Betrieb brechen oder zurückkehren? Herkömmliche Schleifen ermöglichen eine frühzeitige Unterbrechung oder Rückkehr, aber die Stream's foreach -Methode unterstützt diese Methode nicht direkt. In diesem Artikel werden die Gründe erläutert und alternative Methoden zur Implementierung vorzeitiger Beendigung in Strahlverarbeitungssystemen erforscht. Weitere Lektüre: Java Stream API -Verbesserungen Stream foreach verstehen Die Foreach -Methode ist ein Terminalbetrieb, der einen Vorgang für jedes Element im Stream ausführt. Seine Designabsicht ist

See all articles