Verhaltenslinie des Garbage Collectors (Memory Reclaimer)
Der Java-Programmierer muss die Speicherzuweisung nicht überwachen, da der Garbage Collector den Speicher automatisch verwaltet. Der Garbage Collector wird von der Java Virtual Machine (JVM) ausgeführt. Der Garbage Collector ist ein Prozess mit niedriger Priorität, der regelmäßig ausgeführt wird und Speicher freigibt, der von Objekten verwendet wird, die nicht mehr benötigt werden. Verschiedene JVMs verfügen über unterschiedliche Garbage-Collection-Algorithmen. Es werden mehrere Algorithmen verwendet, zum Beispiel: Referenzzählalgorithmus oder Markup- und Scraping-Algorithmen.
Ausführen des Garbage Collectors in Java
Die JVM führt den Garbage Collector normalerweise aus, wenn der freie Speicher knapp wird. Der Betrieb des Garbage Collectors garantiert jedoch nicht, dass immer genügend freier Speicher vorhanden ist. Wenn auch nach der Wiederherstellung nicht genügend Speicher vorhanden ist, löst die JVM eine OutOfMemoryError-Ausnahme aus. Bitte beachten Sie, dass die JVM den Garbage Collector mindestens einmal ausführen muss, bevor sie eine Ausnahme auslöst. Sie können die Ausführung des Garbage Collectors in Java anfordern, diese Aktion jedoch nicht erzwingen.
Anforderung zum Ausführen des Garbage Collectors
Um eine Anfrage zu stellen, können Sie eine der folgenden Methoden aufrufen:
System.gc()
Runtime.getRuntime().gc()
Eignung zum Betrieb des Garbage Collectors
Ein Objekt muss entsorgt werden, wenn es dem lebenden Stream nicht mehr zur Verfügung steht. Ein Gegenstand kann in verschiedenen Fällen der Entsorgung unterliegen:
- Wenn eine Variable eines Referenztyps, die auf ein Objekt verweist, auf „0“ gesetzt ist, muss das Objekt entsorgt werden, sofern keine anderen Referenzen darauf vorhanden sind.
- Wenn eine Variable eines Referenztyps, die auf ein Objekt verweist, erstellt wird, um auf ein anderes Objekt zu verweisen, muss das Objekt verworfen werden, wenn keine anderen Referenzen darauf vorhanden sind.
- Lokal in einer Methode erstellte Objekte werden verworfen, wenn die Methode beendet wird, es sei denn, sie werden aus dieser Methode exportiert (d. h. zurückgegeben oder als Ausnahme ausgelöst).
- Objekte, die aufeinander verweisen, können der Löschung unterliegen, wenn keines davon für den Live-Thread verfügbar ist.
Schauen wir uns ein Beispiel an:
public class TestGC
{
public static void main(String [] args)
{
Object o1 = new Integer(3);
Object o2 = new String("Tutorial");
o1 = o2;
o2 = null;
}
}
In diesem Beispiel
Integer
kann das Objekt (Ganzzahl), auf das ursprünglich durch Zeiger o1 verwiesen wurde, nach Zeile 3 verworfen werden, da o1 jetzt auf das Objekt
String
(Zeichenfolge) verweist. Obwohl o2 erstellt wurde, um auf Null zu verweisen,
String
kann das Objekt (String) nicht recycelt werden, da o1 darauf verweist.
Finalisierung
Mit der Java-Technologie können Sie eine Methode (finalize) verwenden,
finalize()
um die erforderliche Bereinigung durchzuführen, bevor der Garbage Collector ein Objekt aus dem Speicher abruft. Diese Methode wird vom Garbage Collector für ein Objekt aufgerufen, wenn der Garbage Collector feststellt, dass keine weiteren Verweise auf das Objekt vorhanden sind. Dies wird in der Klasse beschrieben
Object
, was bedeutet, dass es von allen Klassen vererbt wird. Die Unterklasse überschreibt die Methode,
finalize()
um sich von Systemressourcen zu befreien oder eine andere Bereinigung durchzuführen:
protected void finalize() throws Throwable
Wenn die Methode eine nicht registrierte Ausnahme auslöst
finalize()
, wird die Ausnahme ignoriert und die Finalisierung dieses Objekts wird gestoppt. Die Methode
finalize()
wird während der Lebensdauer des Objekts nur einmal aufgerufen.
finalize()
Es ist möglich , auf jedes Objekt eine Methode anzuwenden, um es vor der Entsorgung zu schützen.
finalize()
In diesem Fall ist der Garbage Collector für dieses Objekt jedoch nicht mehr aktiviert . Die Methode
finalize()
wird immer einmal aufgerufen, bevor das Objekt in die Garbage Collection aufgenommen wird. Es ist jedoch möglich, dass die Methode
finalize()
für ein bestimmtes Objekt nicht für die gesamte Dauer seines Bestehens aktiviert wird, da es möglicherweise nicht der Entsorgung unterliegt.
Zusammenfassung
In diesem Abschnitt haben wir uns mit dem Garbage-Collection-Prozess befasst, einer Speicherverwaltungstechnik in der Java-Sprache. Die Garbage Collection kann nicht erzwungen werden. Wir haben die verschiedenen Möglichkeiten kennengelernt, Objekte für das Recycling geeignet zu machen, und erfahren, dass die Methode
finalize()
aufgerufen wird, bevor das Objekt vom Garbage Collector zurückgefordert wird.
Übung
Frage: Wie viele Gegenstände werden nach Zeile 7 entsorgt?
public class TutorialGC
{
public static void main(String [] args)
{
Object a = new Integer(100);
Object b = new Long(100);
Object c = new String("100");
a = null;
a = c;
c = b;
b = a;
}
}
Antwortmöglichkeiten: A. 0 B. 1 C. 2 D. 3 E. Der Code kann nicht kompiliert werden.
Richtige Option: B
Erläuterung: Von den drei in den Zeilen 1, 2 und 3 erstellten Objekten muss nur das Objekt
Integer
am entsorgt werden Ende von Zeile 7. Variablenreferenzen, a, die ursprünglich auf das Objekt verwiesen haben
Integer
, referenzieren das Objekt
String
in Zeile 5. Daher
Integer
muss das Objekt nach Zeile 5 entsorgt werden, da es keine Variablen gibt, die darauf verweisen. Variablen
b
und
c
beziehen sich auf Objekte
String
und
Long
Objekte in den Zeilen 6 und 7 und sind daher nicht recycelbar.
GO TO FULL VERSION