Was ist Java Garbage Collector?
Der Garbage Collector ist ein Daemon-Thread, der zur Laufzeit Speicher freigibt. Speicherbereinigung kann auch als Speicherrecycling ausgedrückt werden. In JVM wird aufgrund seiner Effizienz meistens ein Oracle Hotspot-Garbage Collector verwendet. Der Speicherbereich in JVM, in dem Objekte erstellt werden, wird als Heap bezeichnet. Heap ist in zwei Teile geteilt:
- Raum für junge Generationen
- Alter / fester Generationsraum
Die junge Generation ist wieder in 3 Teile gegliedert
- Eden Raum
- Überlebender Von
- Überlebender zu
Eine tiefere Erklärung wurde in den nächsten Punkten gegeben. Wenn Sie beispielsweise in Ihrem Programm einen Cache erstellt haben und das Cache-Objekt viele GC-Zyklen überstanden hat, gehört es zur alten Generation. Der GC sucht nach Objekten, die vom Programm nicht mehr benötigt werden, und zerstört sie.
Warum Müllsammler?
Vor Java waren zwei der beliebtesten Sprachen C und C ++. In C sind wir auf calloc (), malloc (), realloc () gestoßen, die Pufferspeicher zuweisen, und in C ++ haben wir Destruktoren. Alle diese Funktionen sind für die Funktion Speicherverwaltung vorgesehen. Java bietet Garbage Collector aus den beiden Hauptgründen als automatische Speicherverwaltung an:
- Einige erstellte Objekte können nicht mehr erreicht werden
- Referenzen von alten Objekten zu jungen Objekten existieren nur in geringer Anzahl.
Die beste Methode zur Verwendung eines Garbage Collectors ist das Setzen von Flags in JVM.
Lassen Sie mich ein Beispiel für nicht erreichbare Objekte geben
//class code
int i = 1;
if(i == 1)(
String s = abc;
System.out.println(s);
)
//class code
Im obigen Beispiel erstellt Java ein String-Objekt und der Bereich dieses Objekts liegt genau darin, wenn der Block nicht außerhalb verwendet werden kann. Wenn die Garbage Collection über diese Klasse läuft, markiert sie 's' als nicht erreichbares und nicht verwendetes Objekt und löscht es.
Funktionen im Garbage Collector
- Markieren: Beginnt am Wurzelknoten Ihrer Anwendung (Hauptknoten), durchläuft den Objektgraphen und markiert Objekte, die erreichbar sind, als Leben.
- Löschen / Sweepen: Löschen Sie nicht erreichbare Objekte. Wenn der GC Objekte löscht, wird eine Lücke im Heap erstellt, die ihn inkonsistent macht. Somit wird die Verdichtung verwendet.
- Komprimieren: Komprimieren Sie den Speicher, indem Sie sich um die Objekte bewegen und die Zuordnung zusammenhängend als fragmentiert markieren. Es ist eine zeitraubende Aufgabe.
Wie funktioniert Java Garbage Collector?
- Es gibt zwei Arten von Objekten:
Live-Objekte: Erreichbar (Referenzen von einem anderen Objekt)
Tote Objekte: Nicht erreichbar (von überall nicht referenziert)
- Alle neu erstellten Objekte werden im Eden-Raum (Young Generation-Raum) erstellt.
- Sobald der Eden-Speicherplatz voll ist, wird ein minorGC () - Programm auf dem Young Generation-Speicherplatz ausgeführt, das alle nicht verwendeten oder toten Objekte markiert und aus dem Speicher entfernt.
- Die Objekte, die diesen GC-Zyklus überlebt haben, werden aus dem Weltraum in den Überlebenden versetzt. Der gleiche Vorgang wiederholt sich und diesmal, wenn Objekte aus dem Eden-Raum nach Survivor verschoben werden. Aus dem Weltraum überprüft GC, ob sie voll sind. Die toten Objekte werden freigegeben und überlebte Objekte werden ebenfalls nach Survivor verschoben.
- Dieser Vorgang wird wiederholt. Wenn einige Objekte eine bestimmte Anzahl von GC-Zyklen überstanden haben, werden diese Objekte in den Bereich der alten Generation verschoben.
- In diesem Szenario führt JVM die Funktion majorGC () aus, die den gesamten Heap-Speicherplatz durchläuft, unbenutzte (leere oder tote) Objekte identifiziert / markiert und alle diese Objekte durchsucht.
- Denken Sie daran, dass das Entfernen von Objekten aus dem Heap-Bereich zu Speicherlücken führt, die einen Speicherverlust verursachen. Um ein solches Szenario zu vermeiden, implementiert der Garbage Collector die Komprimierung des Speicherplatzes
Beispiele für Garbage Collector in Java
Beispiel für system.gc ():
class Demo (
public void finalize()(
System.out.println(“Object”);
)
public static void main(String args())(
Demo obj1 = new Demo();
Demo obj2 = new Demo();
obj1 = null;
obj2 = null;
System.gc();
)
)
Ausgabe:
Objekt
Erklärung des obigen Codes
- Im obigen Code zeigen die beiden Objekte obj1 und obj2 auf null, sodass sie mit null und nicht referenzierten Werten im Eden-Raum gespeichert werden
- System gc () ruft einen Daemon-Thread der Garbage Collection auf und beide Objekte werden aus dem Space gelöscht.
Pro und Contra
Nachfolgend einige Vor- und Nachteile von Java Garbage Collector:
Vorteile von gc:
- Die Speicherbereinigung erhöht die Speichereffizienz, da alle nicht verwendeten und leeren Objekte gelöscht werden
- Ein Garbage Collector ist ein automatischer Prozess, weshalb sich der Entwickler möglicherweise nicht darum kümmert, da in anderen Sprachen ohne einen Garbage Collector ein Programmierer schwer fassbare Speicherprobleme lösen muss.
Nachteile von gc:
- Der Garbage Collector führt die Hauptfunktion gc aus, die den gesamten Heap-Speicherplatz durchläuft, wodurch Ihr Programm einige Sekunden langsamer wird.
- Dieser Vorgang benötigt mehr CPU-Zeit, wodurch das Codesystem langsamer wird.
- Wenn Sie an einer Anwendung arbeiten, die sehr viel Speicher benötigt, verwenden Sie die verfügbaren JVM-Flags.
- Wenn der Heap-Speicher voll ist und Objekte nicht mehr gewischt oder hinzugefügt werden können, wird der Speicher von Java verlassen. Dies verlangsamt die gesamte Anwendung und kann außerdem zu Speicherverlusten führen.
Empfohlene Artikel
Dies ist eine Anleitung zu Was ist Java Garbage Collector ?. Hier diskutieren wir die Arbeit mit Funktionen, Beispiel, Vor- und Nachteilen von Java Garbage Collector. Weitere Informationen finden Sie auch in den folgenden Artikeln.
- Konstruktor und Destruktor in Java
- Destruktor in Java
- C # vs Java-Leistung
- Was ist JVM?