JavaRush /Java-Blog /Random-DE /Garbage Collector in Java
Diana
Level 41

Garbage Collector in Java

Veröffentlicht in der Gruppe Random-DE

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.Müllabfuhr – 1

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);               // Line 1
      Object o2 = new String("Tutorial");       // Line 2
      o1 = o2;                                  // Line 3
      o2 = null;                                // Line 4
      // Rest of the code here
    }
  }
In diesem Beispiel Integerkann 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, Stringkann 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);  // Line1
      Object b = new Long(100);     // Line2
      Object c = new String("100"); // Line3
      a = null;                     // Line4
      a = c;                        // Line5
      c = b;                        // Line6
      b = a;                        // Line7
      // Rest of the code here
    }
  }
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 Integeram entsorgt werden Ende von Zeile 7. Variablenreferenzen, a, die ursprünglich auf das Objekt verwiesen haben Integer, referenzieren das Objekt Stringin Zeile 5. Daher Integermuss das Objekt nach Zeile 5 entsorgt werden, da es keine Variablen gibt, die darauf verweisen. Variablen bund cbeziehen sich auf Objekte Stringund LongObjekte in den Zeilen 6 und 7 und sind daher nicht recycelbar.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION