Heim  >  Artikel  >  Java  >  JVM-Speicherverwaltung ------ Einführung in GC

JVM-Speicherverwaltung ------ Einführung in GC

黄舟
黄舟Original
2016-12-28 15:31:201523Durchsuche

Warum müssen Sie GC-Strategien und -Prinzipien verstehen?

Der Grund wurde bereits im vorherigen Kapitel angesprochen. Er liegt darin, dass es bei der täglichen Arbeit und Forschung unvermeidlich ist, auf Probleme mit Speicherüberlauf und Speicherlecks zu stoßen. Wenn Sie auf die oben genannten Probleme stoßen, ohne die GC-Strategie und -Prinzipien zu verstehen, fühlen sich die Leute oft ratlos.
Nachdem wir das relevante Wissen verstanden haben, ist es sicher, dass wir zumindest nicht ratlos sein werden, auch wenn wir das Problem manchmal immer noch nicht schnell lösen können.

Welche Probleme löst die GC-Strategie?

Da eine automatische GC durchgeführt werden soll, müssen entsprechende Strategien vorhanden sein. Welche Probleme lösen diese Strategien grob gesagt?
1. Welche Gegenstände können recycelt werden?
2. Wann diese Gegenstände recycelt werden sollten.
3. Welche Recyclingmethode wird verwendet?

[b]Welcher Algorithmus wird in der GC-Strategie verwendet?[/b]

In Bezug auf die drei oben genannten Fragen ist die erste Frage tatsächlich die wichtigste, nämlich welche Objekte sind recycelbar.
Es gibt eine relativ einfache und intuitive Methode, die effizienter ist und als Referenzzählalgorithmus bezeichnet wird. Dieser Algorithmus weist jedoch einen schwerwiegenden Fehler auf: Er kann Objekte mit Zirkelverweisen nicht recyceln. Stellen Sie sich vor, dass, wenn die JVM diese GC-Strategie übernimmt, beim Schreiben von Programmen durch Programmierer nicht damit gerechnet werden sollte, dass Code wie der folgende erneut angezeigt wird.

public class Object {  
    Object field = null;  
      
    public static void main(String[] args) {  
        Thread thread = new Thread(new Runnable() {  
            public void run() {  
                Object objectA = new Object();  
                Object objectB = new Object();//1  
                objectA.field = objectB;  
                objectB.field = objectA;//               //to do something  
                objectA = null;  
                objectB = null;//3  
            }  
        });  
        thread.start();  
        while (true);  
    }  
      
}

Dieser Code scheint etwas gewollt zu sein, aber tatsächlich kommt er häufig im eigentlichen Programmierprozess vor, z. B. bei zwei Datenbankobjekten mit einer Eins-zu-Eins-Beziehung, die jeweils einen Verweis auf das andere beibehalten . Die letzte Endlosschleife dient lediglich dazu, das Beenden der JVM zu verhindern und hat keine praktische Bedeutung.
Für den GC, den wir jetzt verwenden, werden am Ende des Thread-Threads sowohl ObjektA als auch ObjektB als zu recycelnde Objekte verwendet. Und wenn unser GC den oben erwähnten Referenzzählalgorithmus übernimmt, werden diese beiden Objekte niemals recycelt, selbst wenn wir die Objekte nach der Verwendung explizit als Null klassifizieren, hat dies keine Auswirkung.
Hier ist eine kurze Erklärung von LZ. Im Code hat LZ die drei Zahlen 1, 2 und 3 markiert. Nachdem die Anweisung an erster Stelle ausgeführt wurde, sind die Referenzanzahlen der beiden Objekte alle 1. Wenn die Anweisung an zweiter Stelle ausgeführt wird, werden die Referenzanzahlen beider Objekte zu 2. Nachdem die Anweisung an dritter Stelle ausgeführt wurde, d. h. nachdem beide als Nullwerte klassifiziert wurden, beträgt der Referenzzähler der beiden immer noch 1. Gemäß den Recyclingregeln des Referenzzählalgorithmus wird der Referenzzähler erst recycelt, wenn er 0 erreicht.

Root-Suchalgorithmus

Aufgrund der Mängel des Referenzzählalgorithmus verwendet JVM im Allgemeinen einen neuen Algorithmus namens Root-Suchalgorithmus. Seine Verarbeitungsmethode besteht darin, mehrere Root-Objekte einzurichten. Wenn ein Root-Objekt für ein bestimmtes Objekt nicht erreichbar ist, wird das Objekt als recycelbar betrachtet.

JVM-Speicherverwaltung ------ Einführung in GC

Nehmen Sie das Bild oben als Beispiel: ObjectD und ObjectE sind miteinander verbunden, aber da GC-Wurzeln für diese beiden Objekte nicht erreichbar sind, sind D und E immer noch erreichbar Wenn die Referenzzählmethode in der obigen Abbildung verwendet wird, wird als GC-Objekt keines der fünf Objekte A-E recycelt.
Apropos GC-Roots: In der JAVA-Sprache können die folgenden Objekte als GC-Roots verwendet werden:
1. Objekte, auf die im Stapel der virtuellen Maschine verwiesen wird.
2. Das Objekt, auf das das statische Klassenattribut im Methodenbereich verweist.
3. Das Objekt, auf das die Konstante im Methodenbereich verweist.
4. Das von JNI referenzierte Objekt im lokalen Methodenstapel.
Die erste und vierte Methode beziehen sich beide auf die lokale Variablentabelle der Methode. Der zweite Ausdruck hat eine klarere Bedeutung. Die dritte Methode bezieht sich hauptsächlich auf den als endgültig deklarierten konstanten Wert.

Garbage-Collection-Algorithmus

Der Root-Suchalgorithmus löst das Grundproblem der Garbage-Collection, das erste oben erwähnte und kritischste Problem, nämlich welche Objekte recycelt werden können.
Allerdings muss die Müllabfuhr offensichtlich noch die letzten beiden Probleme lösen, wann und wie recycelt werden soll. Basierend auf dem Root-Suchalgorithmus gibt es bei der Implementierung moderner virtueller Maschinen drei Haupt-Garbage-Collection-Algorithmen, nämlich den Mark-Clear-Algorithmus, den Copy-Algorithmus und den Mark-Sort-Algorithmus. Diese drei Algorithmen erweitern alle den Root-Suchalgorithmus, sind aber dennoch sehr einfach zu verstehen.

Fazit

Das Obige ist der Inhalt der JVM-Speicherverwaltung ------Einführung in GC Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php. cn)!


Stellungnahme:
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