what is garbage collection java
In diesem Tutorial wird erklärt, was Garbage Collection in Java ist und wie Garbage Collector funktioniert. Sie erfahren auch mehr über Algorithmen für die Garbage Collection:
Die Leser, die sich mit C / C ++ auskennen, müssen sich bewusst sein, dass es in der Verantwortung des Programmierers liegt, die Objekte in C / C ++ zu erstellen und zu löschen.
Schwerwiegende Fehler treten auf, wenn der Programmierer vergisst, die erstellten Objekte zu zerstören. Dies liegt daran, dass das Nichtzerstören der Objekte dazu führen kann, dass OutOfMemory ”Fehler, Speicherlecks usw.
Diese Situation wird in Java vollständig behoben, da kein Programmierer die Objekte im Auge behalten muss. Java kümmert sich für uns um die Objektzerstörung durch automatische Speicherbereinigung.
=> Besuchen Sie hier, um Java von Grund auf neu zu lernen.
Der Prozess, mit dem die nicht mehr verwendeten Objekte aus dem Heapspeicher entfernt werden, wird als 'Garbage Collection' bezeichnet. Die Garbage Collection-Technik ist Teil der Speicherverwaltung in Java.
Daher zerstört der Garbage Collector in Java alle Objekte, die nicht mehr verwendet werden.
Was du lernen wirst:
- Was ist ein Garbage Collector in Java?
- Wie funktioniert die Garbage Collection in Java?
- Garbage Collection-Algorithmen in Java
- Fazit
Was ist ein Garbage Collector in Java?
Die Garbage Collection in Java wird von einem Programm namens Garbage Collector verwaltet.
Garbage Collector kann als ein Programm definiert werden, mit dem der Speicher automatisch verwaltet wird, indem die Zuordnung der Objekte aufgehoben wird.
Wir wissen, dass in der Java-Sprache die neuen Objekte mit dem neuen Operator erstellt und Speicher zugewiesen werden. Der einem Objekt mithilfe eines neuen Operators zugewiesene Speicher bleibt zugewiesen, bis die Referenzen dieses Objekt verwenden.
Sobald die Referenzen nicht mehr existieren, wird der Speicher, den das Objekt belegt, zurückgefordert. Java behandelt dann die Aufhebung oder Zerstörung von Objekten automatisch und wir müssen das Objekt nicht explizit zerstören.
Diese Technik ist die Garbage Collection-Technik in Java, bei der die Programmierer die Freigabe von Objekten nicht explizit behandeln müssen.
Beachten Sie, dass, wenn die Programme den Speicher nicht freigeben, wenn die Objekte ihn nicht benötigen, möglicherweise kein Speicher mehr zugewiesen werden kann und die Programme abstürzen. Diese Situation wird als Speicherverlust bezeichnet.
Der Garbage Collector wird immer im Hintergrund in einem Daemon-Thread ausgeführt. Garbage Collector gilt als das beste Beispiel für den Daemon-Thread.
Garbage Collector wird ausgeführt, um den Heapspeicher freizugeben. Dies geschieht durch Zerstörung der Objekte, die „nicht erreichbar“ sind.
Was ist ein „nicht erreichbares“ Objekt?
Ein Objekt wird nicht mehr erreichbar, wenn ihm nicht einmal eine einzige Referenz zugeordnet ist.
Betrachten Sie den folgenden Code:
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
Wie aus dem obigen Code hervorgeht, ist ein Objekt erreichbar, solange ihm eine Referenz zugeordnet ist. Sobald die Referenzzuordnung entfernt wird (im obigen Fall eine Einstellungsreferenz auf null), ist das Objekt nicht mehr erreichbar.
Wenn ein Objekt nicht mehr erreichbar ist, kann es für die Garbage Collection (GC) verwendet werden.
Wie können wir ein Objekt für die GC qualifizieren?
Obwohl der Programmierer nicht verpflichtet ist, die Objekte zu zerstören, da sie von GC gepflegt werden, kann der Programmierer diese Objekte zumindest unerreichbar machen, wenn sie nicht mehr benötigt werden.
Auf diese Weise sammelt GC die nicht erreichbaren Objekte und zerstört sie.
Es gibt einige Möglichkeiten, ein Objekt für die GC zu qualifizieren, indem es nicht erreichbar ist.
Sie sind:
# 1) Die Referenz aufheben
Wenn dieses Objekt bei einer einem Objekt zugewiesenen Referenz nicht mehr benötigt wird, weisen Sie die Referenz null zu.
Student s = new Student (); s = null;
Wenn s auf null gesetzt ist, ist das Student-Objekt nicht mehr erreichbar.
# 2) Weisen Sie die Referenz neu zu
Dies ist eine weitere Möglichkeit, die Objekte für die GC zu qualifizieren.
Betrachten Sie den folgenden Code.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
Nachdem wir s1 einem anderen Objekt zugewiesen haben, wird das von s1 referenzierte Student-Objekt dereferenziert.
# 3) Erstellen Sie ein anonymes Objekt
Durch das Erstellen eines anonymen Objekts können wir die Objekte für die GC qualifizieren.
Wir können ein anonymes Objekt wie folgt erstellen:
new Student();
Sobald wir die Objekte für die GC in Frage stellen, können diese Objekte durch die GC sofort zerstört werden oder nicht. Dies liegt daran, dass wir den GC nicht explizit zwingen können, ihn nach Belieben auszuführen.
Wann läuft der Garbage Collector?
Es liegt an der JVM, das Garbage Collector-Programm auszuführen. Wenn JVM den Garbage Collector ausführt, werden die nicht erreichbaren Objekte zerstört. Wir können jedoch nicht garantieren, wann die JVM ausgeführt wird.
Obwohl wir die Ausführung des GC nicht erzwingen können, können wir sehr gut eine Garbage Collection anfordern.
Der GC kann mit einer der folgenden Methoden angefordert werden.
# 1) System.gc (): Die Systemklasse von Java bietet eine statische Methode gc (), mit der wir die JVM auffordern können, Garbage Collector auszuführen.
# 2) Runtime.getRuntime (). Gc (): Wie System.gc () können wir auch die gc () -Methode der 'Runtime-Klasse' verwenden, um JVM aufzufordern, Garbage Collector auszuführen.
Hinweis: Es gibt keine Garantie dafür, dass der Garbage Collector nach einer Anforderung dieser beiden Methoden ausgeführt wird.
Finalisierung
Die Finalisierung wird von Garbage Collector unmittelbar vor der Zerstörung der Objekte durchgeführt. Als Teil der Finalisierungstechnik ruft der Garbage Collector die finalize () -Methode für das Objekt auf. Die finalize () -Methode wird verwendet, um Bereinigungsaktivitäten durchzuführen.
Die Methode finalize () wird von der Klasse 'Object' bereitgestellt und hat den folgenden Prototyp.
protected void finalize () throws Throwable
Die finalize () -Methode wird immer dann aufgerufen, wenn das Objekt durch Müll gesammelt wird
Hinweis: Der Garbage Collector sammelt nur die Objekte, die mit dem neuen Schlüsselwort erstellt wurden. Für andere Objekte müssen wir die Methode finalize () verwenden, um die Bereinigung durchzuführen.
Das folgende Programm zeigt eine einfache Garbage Collection in Java.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
Ausgabe
Im obigen Programm haben wir eine Klasse TestGC erstellt. In dieser Klasse haben wir die Methode finalize () überschrieben. Dann erstellen wir in der Hauptklasse zwei Objekte der TestGC-Klasse. Zuerst machen wir ein Objekt ungültig und rufen System.gc () auf, um Garbage Collector anzufordern.
Als nächstes machen wir das zweite Objekt ungültig und rufen die Methode Runtime.getRuntime.gc () auf, um Garbage Collector anzufordern. Die Ausgabe zeigt die Ausgabe der Finalize-Methode zweimal, wodurch angezeigt wird, dass der Garbage Collector zweimal ausgeführt wurde.
Hinweis: Obwohl wir diese Ausgabe haben, kann nicht garantiert werden, dass wir jedes Mal dieselbe Ausgabe erhalten. Es hängt vollständig von JVM ab.
Wie funktioniert die Garbage Collection in Java?
In diesem Abschnitt erfahren Sie, wie die Garbage Collection in Java funktioniert.
Während der Garbage Collection sucht der Garbage Collector im Heap-Speicher und „markiert“ dann die nicht erreichbaren Objekte. Dann zerstört es sie.
Das Problem tritt jedoch auf, wenn die Anzahl der Objekte zunimmt. Wenn die Objekte zunehmen, nimmt auch die für die Speicherbereinigung benötigte Zeit zu, da nach nicht erreichbaren Objekten gesucht wird. Dies wirkt sich jedoch nicht zu stark aus, da die meisten Objekte eine kurze Lebensdauer haben.
Das obige Verhalten wird aufgerufen 'Generationsmüllsammlung' und soll die JVM-Leistung verbessern. Bei diesem Ansatz wird der gesamte Heap-Bereich in junge Generationen, alte oder dauerhafte Generationen und permanente Generationen unterteilt.
# 1) Haufenraum der jungen Generation: Alle neuen Objekte werden in diesem Bereich erstellt. Sobald der Raum voll ist, findet ein Minor GC statt, bei dem alle toten Objekte zerstört werden. Der kleinere GC-Prozess ist schnell und schnell, da die meisten Objekte tot sind. Die Objekte, die die junge Generation überleben, werden zu den älteren Generationen verschoben.
# 2) Heap Space der alten Generation: Diese Generation speichert Objekte, die lange überleben. Wenn das für die junge Generation festgelegte Schwellenalter erreicht ist, wird das Objekt in die alte Generation verschoben. Wenn der Raum der alten Generation gefüllt ist, wird eine Haupt-GC durchgeführt.
Major GC ist langsam, da es sich bei den hier beteiligten Objekten um lebende Objekte handelt. Manchmal wird der gesamte Heap-Bereich, der sowohl junge als auch alte Generationen umfasst, geräumt. Dies wird als 'Full GC' bezeichnet.
# 3) Permanente GenerationL Bis Java 7 gab es eine permanente Generation (Perm Gen). Die von Perm Gen gehaltenen Metadaten wurden von JVM verwendet. JVM verwendete diese Metadaten, um in der Anwendung verwendete Klassen und Methoden zu beschreiben. Das Perm Gen wurde in Java 8 entfernt.
Java 8 Garbage Collection: Perm Gen und Metaspace
Wir haben bereits über den bis Java 7 vorhandenen Perm-Gen-Speicherplatz gesprochen. In Java 8 repräsentiert die JVM jedoch die Klassenmetadaten unter Verwendung des nativen Speichers namens „Metaspace“.
Neben Metaspace gibt es ein neues Flag namens 'MaxMetaspaceSize', das den für Klassenmetadaten verwendeten Speicher begrenzt. Wenn für MaxMetaspaceSize kein Wert angegeben ist, ändert der Metaspace die Größe zur Laufzeit entsprechend den Anwendungsanforderungen.
Wenn der Klassenmetadatenbereich MaxMetaspaceSize erreicht, wird der Metaspace GC ausgelöst. Wenn ein übermäßiger Metaspace GC vorliegt, weist dies auf einen Speicherverlust von Klassen, Klassenladeprogrammen usw. sowie auf eine unzureichende Größe hin.
Garbage Collection-Algorithmen in Java
Es gibt verschiedene Möglichkeiten, wie die Garbage Collection durchgeführt wird. In diesem Abschnitt werden vier solcher Methoden oder Algorithmen für die Garbage Collection in Java vorgestellt.
Serielle GC
Serielle GC ist der einfachste GC-Algorithmus. Es funktioniert hauptsächlich auf kleinen Heap-Größen und Single-Threaded-Systemen. Während der Arbeit friert Serial GC alle Anwendungen ein.
Um Serial GC zu aktivieren, können Sie die folgende JVM-Option verwenden.
Was ist der beste Werbeblocker für Chrom?
java –xx:+UseSerialGC –jar Application.java
Der obige Befehl kann in der Befehlszeile angegeben werden. Hier ist Application.java eine Datei, für die der serielle GC aktiviert werden soll.
Durchsatz / Parallel GC
Der parallele GC-Algorithmus ist der Standardalgorithmus in JDK 8. Dieser Algorithmus verwendet mehrere Threads, um den Heap-Speicherplatz und die Komprimierung zu scannen. Dieser Algorithmus eignet sich hauptsächlich für Anwendungen, die Thread-Pausen verarbeiten und den CPU-Overhead optimieren können.
Ein Nachteil der parallelen GC besteht darin, dass der Algorithmus während der Durchführung einer kleinen oder vollständigen GC die Anwendungsthreads anhält.
Der CMS-Sammler
Das CMS steht für “ Gleichzeitiger Mark Sweep ”. Dieser Algorithmus verwendet mehrere gleichzeitig Threads zum Scannen des Heaps ( Kennzeichen ) um nicht verwendete Objekte zu identifizieren und zu recyceln ( fegen ) Sie. Der CMS-Kollektor verfügt über einen Modus Stop-The-World (STW).
Der Kollektor wechselt in zwei Szenarien in diesen Modus:
- Wenn Objekte der alten Generation über statische Variablen oder Thread-Einstiegspunkte erreicht werden können. Dieser Modus ist also während der Initialisierung der anfänglichen Wurzelmarkierungen aktiviert.
- Wenn der Algorithmus gleichzeitig ausgeführt wird, ändert die Anwendung den Status und zwingt den Kollektor, zurück zu gehen, um sicherzustellen, dass die richtigen Objekte markiert sind.
Der CMS-Kollektor kann jedoch unter 'Promotion-Fehlern' leiden. Was ist ein Werbefehler? Wenn die Objekte aus dem Bereich der jungen Generation in die alte Generation verschoben werden und der Kollektor nicht genügend Platz für diese Objekte im Heap-Bereich der alten Generation geschaffen hat, tritt ein Werbefehler auf.
Um Werbefehler zu vermeiden, stellen wir dem Collector möglicherweise mehr Hintergrundthreads zur Verfügung oder stellen der alten Generation mehr Heap-Größe zur Verfügung.
Der G1-Sammler
Der G1-Kollektor ist der 'Garbage-First' -Sammler. Es ist für Heap-Größen von mehr als 4 GB ausgelegt. Basierend auf der Heap-Größe wird die Heap-Größe in Bereiche mit Größen von 1 MB bis 32 MB unterteilt.
Der G1-Sammler markiert die Objekte in Abhängigkeit von der Lebendigkeit der Objekte im gesamten Haufen. Nach dieser Markierungsphase sind G1 die leeren Bereiche bekannt. Auf diese Weise werden die nicht erreichbaren Objekte aus diesen Regionen gesammelt, wodurch viel Platz frei wird. Daher wird es als Garbage-First bezeichnet, da es Regionen sammelt, die zuerst Garbage enthalten.
Es erfüllt auch das benutzerdefinierte Pausenzeitziel, indem ein Pausenvorhersagemodell verwendet wird, indem die Anzahl der zu erfassenden Regionen in Abhängigkeit vom angegebenen Pausenzeitziel ausgewählt wird.
Vorteil der Müllabfuhr
- Mit Garbage Collection wird die Speicherverwaltung in Java effizient, da nicht referenzierte Objekte ohne Einmischung des Programmierers aus dem Heapspeicher entfernt werden.
- Da die Garbage Collection automatisch erfolgt und Teil von JVM ist, sind vom Programmierer keine zusätzlichen Anstrengungen erforderlich, um Speicher zurückzugewinnen oder Objekte zu zerstören.
- Der Programmierer muss keinen bestimmten Code schreiben, um die Zuordnung des Speichers aufzuheben und Objekte zu löschen, wie in C / C ++ ausgeführt.
Häufig gestellte Fragen
F # 1) Welche Rolle spielt ein Garbage Collector?
Antworten: In Java ist der Garbage Collector die Hauptpartei in der Speicherverwaltung und hat die Aufgabe, die nicht erreichbaren Objekte zu sammeln und den Speicher zurückzugewinnen.
F # 2) Was meinst du mit Garbage Collection?
Antworten: Die Speicherbereinigung ist die Technik, mit der der Speicher automatisch verwaltet wird, indem der nicht verwendete Speicher zurückgefordert wird. Es ist eine Funktion, die in Programmiersprachen wie Java vorhanden ist, aufgrund derer die Programmierer die nicht verwendeten Objekte nicht verfolgen und zerstören müssen. Dies erfolgt automatisch mithilfe der Speicherbereinigung.
Q # 3) Wer ist für die Garbage Collection in Java verantwortlich?
Antworten: Die Speicherverwaltung von Java liegt in der Verantwortung der Garbage Collection.
Q # 4) Wie können wir die Garbage Collection in Java verhindern?
Antworten: Da der Garbage Collector den Speicher lebendiger Variablen / Objekte nicht zurückfordert, können Sie die Garbage Collection am besten verhindern, indem Sie weiterhin Variablen / Objekte im gesamten Programm verwenden.
Q # 5) Wie können Sie sicherstellen, dass ein Objekt durch Müll gesammelt wird?
Antworten: Ein Objekt kann für die Garbage Collection verwendet werden, wenn es nicht erreichbar ist, d. H. Wenn sich keine weiteren Referenzen auf das Objekt beziehen. Obwohl wir den Garbage Collector nicht zwingen können, wann immer wir wollen, können wir ihn jederzeit mit System.gc () anfordern.
Fazit
Die in diesem Lernprogramm beschriebene Garbage Collection in Java erfolgt automatisch, und der Programmierer muss sich nicht um das Löschen der im Programm zugewiesenen Objekte oder Variablen kümmern.
Die automatische Speicherbereinigung in Java ist das wichtigste Merkmal der Sprache und Teil der Speicherverwaltung in Java.
Obwohl die Garbage Collection von JVM ausgeführt wird und außerhalb der Reichweite des Programmierers liegt, können wir den Garbage Collector jederzeit auffordern, die gc () -Methode der System- und Runtime-Klasse auszuführen.
In diesem Tutorial haben wir den Finalisierungsprozess erläutert, der ausgeführt wird, bevor die Objekte von Garbage Collector zerstört werden. Wir haben auch den Prozess der Garbage Collection in Java besprochen. Schließlich haben wir die verschiedenen Algorithmen diskutiert, die vom Garbage Collector verwendet werden.
Damit ist unsere Diskussion über Garbage Collector in Java abgeschlossen.
=> Sehen Sie sich hier die einfache Java-Schulungsreihe an.
Literatur-Empfehlungen
- Java-Grundlagen: Java-Syntax, Java-Klasse und Java-Kernkonzepte
- Wofür wird Java verwendet: 12 Java-Anwendungen in der realen Welt
- Java String Tutorial | Java-String-Methoden mit Beispielen
- JAVA-Tutorial für Anfänger: Über 100 praktische Java-Video-Tutorials
- Java-Komponenten: Java Platform, JDK, JRE und Java Virtual Machine
- Java-Bereitstellung: Erstellung und Ausführung einer Java-JAR-Datei
- Java Virtual Machine: Wie JVM beim Ausführen von Java-Anwendungen hilft
- Java Reflection Tutorial mit Beispielen