Heim Java javaLernprogramm JVM-Speicherverwaltung ------ Einführung in GC

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

Dec 28, 2016 pm 03:31 PM

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);  
    }  
      
}
Nach dem Login kopieren

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)!


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)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
4 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)

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Mit der Klassenbelastung von Java wird das Laden, Verknüpfen und Initialisieren von Klassen mithilfe eines hierarchischen Systems mit Bootstrap-, Erweiterungs- und Anwendungsklassenloadern umfasst. Das übergeordnete Delegationsmodell stellt sicher

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

In dem Artikel wird in der Implementierung von mehrstufigem Caching in Java mithilfe von Koffein- und Guava-Cache zur Verbesserung der Anwendungsleistung erläutert. Es deckt die Einrichtungs-, Integrations- und Leistungsvorteile sowie die Bestrafung des Konfigurations- und Räumungsrichtlinienmanagements ab

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

In dem Artikel werden mit JPA für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden erläutert. Es deckt Setup, Entity -Mapping und Best Practices zur Optimierung der Leistung ab und hebt potenzielle Fallstricke hervor. [159 Charaktere]

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

In dem Artikel werden Maven und Gradle für Java -Projektmanagement, Aufbau von Automatisierung und Abhängigkeitslösung erörtert, die ihre Ansätze und Optimierungsstrategien vergleichen.

Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Wie erstelle und verwende ich benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning und Abhängigkeitsmanagement? Mar 17, 2025 pm 05:45 PM

In dem Artikel werden benutzerdefinierte Java -Bibliotheken (JAR -Dateien) mit ordnungsgemäßem Versioning- und Abhängigkeitsmanagement erstellt und verwendet, wobei Tools wie Maven und Gradle verwendet werden.

See all articles