Was ist der Garbage Collector in Java?

Lesezeit: 10 Minuten

Was ist der Garbage Collector in Java
Subhransu Mishra

Ich bin neu in Java und verwirrt über den Garbage Collector in Java. Was macht es eigentlich und wann kommt es zum Einsatz? Bitte beschreiben Sie einige der Eigenschaften des Garbage Collectors in Java.

  • mögliches Duplikat von Garbage Collection

    – Ian Ringrose

    26. September 2010 um 15:54 Uhr

  • Manchmal ist es besser, ein Kapitel in einem guten Buch zu lesen, um ein komplexes Thema anhand der Antwort auf eine Frage zu verstehen.

    – Ian Ringrose

    26. September 2010 um 15:56 Uhr

  • @Ian Es ist eine ähnliche Frage, aber kein Duplikat. Und diese Frage stinkt von Hausaufgaben.

    – NullUserException

    26. September 2010 um 15:56 Uhr

Die Müllsammler ist ein Programm, das auf dem läuft Java virtuelle Maschine wodurch Objekte entfernt werden, die von einer Java-Anwendung nicht mehr verwendet werden. Es ist eine Form von automatische Speicherverwaltung.

Wenn eine typische Java-Anwendung ausgeführt wird, erstellt sie neue Objekte, wie z Strings und Files, aber nach einer gewissen Zeit werden diese Objekte nicht mehr verwendet. Sehen Sie sich zum Beispiel den folgenden Code an:

for (File f : files) {
    String s = f.getName();
}

Im obigen Code ist die String s wird bei jeder Iteration von erstellt for Schleife. Dies bedeutet, dass bei jeder Iteration ein wenig Speicher zugewiesen wird, um a zu erstellen String Objekt.

Wenn wir zum Code zurückkehren, können wir sehen, dass, sobald eine einzelne Iteration ausgeführt wurde, in der nächsten Iteration die String Objekt, das in der vorherigen Iteration erstellt wurde, wird nicht mehr verwendet – dieses Objekt wird jetzt als “Müll” betrachtet.

Irgendwann werden wir anfangen, eine Menge Müll zu bekommen, und Speicher wird für Objekte verwendet, die nicht mehr verwendet werden. Wenn dies so weitergeht, wird der Java Virtual Machine irgendwann der Speicherplatz ausgehen, um neue Objekte zu erstellen.

Da kommt der Garbage Collector ins Spiel.

Der Garbage Collector sucht nach Objekten, die nicht mehr verwendet werden, und entfernt sie, wodurch der Speicher freigegeben wird, damit andere neue Objekte diesen Teil des Speichers verwenden können.

In Java wird die Speicherverwaltung vom Garbage Collector erledigt, aber in anderen Sprachen wie C muss man die Speicherverwaltung selbst durchführen, indem man Funktionen wie verwendet malloc und free. Speicherverwaltung gehört zu den Dingen, bei denen man leicht Fehler macht, die zu dem führen können, was man nennt Speicherlecks — Orte, an denen der Speicher nicht zurückgewonnen wird, wenn sie nicht mehr verwendet werden.

Automatische Speicherverwaltungsschemata wie Garbage Collection sorgen dafür, dass sich der Programmierer nicht so sehr um Speicherverwaltungsprobleme kümmern muss, sodass er oder sie sich mehr auf die Entwicklung der Anwendungen konzentrieren kann, die er entwickeln muss.

  • Wäre es richtig zu sagen, dass eine Java-Anwendung, die auf einem Computer läuft, dann zwei Garbage-Collection-Funktionalitäten hat. Einer mit der Java Virtual Machine. Und dann eine auf der eigentlichen Maschine, auf der Windows läuft? (Oder ein anderes Betriebssystem)

    – Lealo

    14. August 2017 um 20:57 Uhr

  • Nein, normalerweise laufen Java-Anwendungen nur, wenn JRE vorhanden ist. Es wird also nur die Garbage-Collection-Funktionalität von JVM benötigt! @Lealo

    – Bin_ich_hilfreich

    15. August 2017 um 4:45 Uhr

Was ist der Garbage Collector in Java
NullUserException

Es gibt Speicher frei, der Objekten zugeordnet ist, die nicht mehr vom Programm verwendet werden – daher der Name “Garbage”. Zum Beispiel:

public static Object otherMethod(Object obj) {
    return new Object();
}

public static void main(String[] args) {
    Object myObj = new Object();
    myObj = otherMethod(myObj);
    // ... more code ...  
}

Ich weiß, das ist extrem gekünstelt, aber hier, nachdem Sie angerufen haben otherMethod() das Original Object erstellt wird unerreichbar gemacht – und das ist “Müll”, der Müll gesammelt bekommt.

In Java läuft der GC automatisch, man kann ihn aber auch explizit mit aufrufen System.gc() und versuchen zu Erzwingen Sie eine große Garbage Collection. Wie Pascal Thivent betont, Sie wirklich sollte nicht müssen, und es könnte mehr schaden als nützen (siehe diese Frage).

Weitere Informationen finden Sie im Wikipedia-Eintrag auf Müllabfuhr und Tuning Garbage Collection (von Oracle)

  • so viel ich weiss System.gc() zwingt GC nicht zur Ausführung.

    – Itay Karo

    26. September 2010 um 15:41 Uhr

  • +1 für das gute Codebeispiel. Beachten Sie, dass es vollkommen gültig ist, dass die GC zerstört myObj vor dem Aufruf an otherMethod findet statt, weil myObj ist zu diesem Zeitpunkt nicht mehr zugänglich.

    – Billy ONeal

    26. September 2010 um 15:42 Uhr

  • @Italien Ich glaube, das ist implementierungsspezifisch.

    – NullUserException

    26. September 2010 um 15:43 Uhr

  • Ich glaube, man sollte nicht anrufen System.gc()der springende Punkt bei einem GC ist, dies nicht tun zu müssen.

    – Pascal Thivent

    26. September 2010 um 15:59 Uhr


  • mit Fluchtanalyse (en.wikipedia.org/wiki/Escape_analysis) ist es möglich, dass die JVM das Objekt in diesem Beispiel gar nicht erst zuweist. Die gesamte Objekterstellung kann (theoretisch) wegoptimiert werden. Implementierungsabhängig natürlich.

    – Mikera

    16. April 2013 um 8:53 Uhr


Was ist der Garbage Collector in Java
Wurzelreisender

Ein Objekt kommt für die Garbage Collection oder GC in Frage, wenn es nicht von Live-Threads oder statischen Referenzen aus erreichbar ist.

Mit anderen Worten, Sie können sagen, dass ein Objekt für die Garbage Collection geeignet ist, wenn alle Referenzen null sind. Zyklische Abhängigkeiten werden nicht als Referenz gezählt. Wenn also Objekt A eine Referenz auf Objekt B und Objekt B eine Referenz auf Objekt A hat und sie keine andere Live-Referenz haben, kommen sowohl Objekt A als auch B für die Garbage-Collection infrage.


Heap-Generationen für Garbage Collection –

Java-Objekte werden in erstellt Heap und Heap wird zum Zwecke der Garbage Collection in Java in drei Teile oder Generationen unterteilt, diese werden als as bezeichnet Junge (neue) Generation, angestellte (alte) Generation und Perm-Bereich des Haufens.

Java heap space
Neue Generation ist weiter in drei Teile unterteilt, die als Eden Space, Survivor 1 und Survivor 2 Space bekannt sind. Wenn ein Objekt zuerst im Heap erstellt wird, wird es in einer neuen Generation im Eden-Raum erstellt und nach der anschließenden kleineren Garbage Collection, wenn ein Objekt überlebt, wird es zu Survivor 1 und dann zu Survivor 2 verschoben, bevor die größere Garbage Collection dieses Objekt verschoben hat alte oder angestellte Generation.

Dauerhafter Platz von Java Heap speichert JVM Metadaten über Klassen und Methoden, String-Pool und Details auf Klassenebene.

Heap-Generationen für Garbage Collection

Weitere Informationen finden Sie hier: Müllabfuhr


Sie können JVM nicht zwingen, die Garbage Collection auszuführen, obwohl Sie eine Anfrage mit stellen können System.gc() oder Runtime.gc() Methode.

In java.lang.System

public static void gc() {
    Runtime.getRuntime().gc();  
}

In java.lang.Runtime

public native void gc();  // note native  method

Mark-and-Sweep-Algorithmus –

Dies ist einer der beliebtesten Algorithmen, die von der Garbage Collection verwendet werden. Jeder Garbage-Collection-Algorithmus muss zwei grundlegende Operationen ausführen. Erstens sollte es in der Lage sein, alle nicht erreichbaren Objekte zu erkennen, und zweitens muss es den von den Müllobjekten belegten Heap-Speicherplatz zurückgewinnen und den Speicherplatz dem Programm wieder zur Verfügung stellen.

Die obigen Operationen werden vom Mark-and-Sweep-Algorithmus in zwei Phasen durchgeführt:

  1. Phase markieren
  2. Sweep-Phase

lesen Sie hier für weitere Details – Mark-and-Sweep-Algorithmus

Garbage Collector bedeutet, dass Objekte, die vom Programm nicht mehr benötigt werden, “Müll” sind und weggeworfen werden können.

1646173038 343 Was ist der Garbage Collector in Java
Itay Karo

Garbage Collector ist Teil von JRE, das sicherstellt, dass Objekte, auf die nicht verwiesen wird, aus dem Speicher gelöscht werden.
Es wird normalerweise ausgeführt, wenn Ihrer App der Speicher ausgeht. AFAIK enthält ein Diagramm, das die Verknüpfungen zwischen den Objekten darstellt, und isolierte Objekte können befreit werden.
Um Leistung zu sparen, werden die aktuellen Objekte in Generationen gruppiert, jedes Mal, wenn GC ein Objekt scannt und feststellt, dass es immer noch referenziert wird, wird seine Generationszählung um 1 erhöht (auf einen maximalen Maximalwert, 3 oder 4, denke ich) und die neue Generation wird zuerst gescannt (je kürzer das Objekt im Speicher, desto wahrscheinlicher wird es nicht mehr benötigt), sodass nicht alle Objekte bei jedem GC-Lauf gescannt werden.
lesen Das für mehr Informationen.

  • @quantumSoup bist du diesbezüglich positiv? Ich glaube, eine Art Garbage Collection (eine teurere) findet nur statt, wenn sich der Haufen füllt.

    – Pablo Fernández

    26. September 2010 um 15:31 Uhr

  • @quantumSoup – das hängt von der GC-Implementierung der JRE ab. In vielen Fällen ist die GC nicht laufen ständig. Stattdessen wird es ausgeführt, wenn Ihre App kein Objekt zuweisen kann, weil der Heap voll ist. Neuere HotSpot-JVMs enthalten zwar einen parallelen GC, dieser ist jedoch standardmäßig nicht aktiviert.

    – Stefan C

    26. September 2010 um 15:34 Uhr


  • Diese Antwort konzentriert sich zu sehr auf den Mechanismus. Die Frage war “Was ist der Garbage Collector”, nicht “Wie funktioniert der Garbage Collector?”

    – Billy ONeal

    26. September 2010 um 15:36 Uhr

  • @quantum: neutralisierte deine -1, weil: Lernen, das heißt, wofür diese Seite ist, richtig? Um zu lernen, muss man Fehler machen. Fehler zu bestrafen führt dazu, dass Menschen nicht lernen. Hoffe, in diesem Punkt können Sie zustimmen. Und vielleicht ist dir hier ein Fehler unterlaufen.

    – erikbstack

    26. September 2010 um 15:39 Uhr


  • @erikb: Nach dieser Logik würde es niemals Downvotes geben. Und Abwertungen sind notwendig, um relativ schlechte Antworten auszusortieren. Das OP ist offensichtlich ein Anfänger, und das spezifische Innenleben des GC ist für die gestellte Frage einfach nicht wichtig. Da diese Antwort die gestellte Frage nicht beantwortet (sie beantwortet eine andere), sind Downvotes vollkommen gerechtfertigt.

    – Billy ONeal

    26. September 2010 um 15:41 Uhr

1646173039 991 Was ist der Garbage Collector in Java
Billy ONeal

Der Garbage Collector ermöglicht es Ihrem Computer, einen Computer mit unendlichem Speicher zu simulieren. Der Rest ist nur Mechanismus.

Dies geschieht, indem es erkennt, wenn Speicherblöcke nicht mehr von Ihrem Code aus zugänglich sind, und diese Blöcke an den kostenlosen Speicher zurückgibt.

EDIT: Ja, der Link ist für C#, aber C# und Java sind in dieser Hinsicht identisch.

  • @quantumSoup bist du diesbezüglich positiv? Ich glaube, eine Art Garbage Collection (eine teurere) findet nur statt, wenn sich der Haufen füllt.

    – Pablo Fernández

    26. September 2010 um 15:31 Uhr

  • @quantumSoup – das hängt von der GC-Implementierung der JRE ab. In vielen Fällen ist die GC nicht laufen ständig. Stattdessen wird es ausgeführt, wenn Ihre App kein Objekt zuweisen kann, weil der Heap voll ist. Neuere HotSpot-JVMs enthalten zwar einen parallelen GC, dieser ist jedoch standardmäßig nicht aktiviert.

    – Stefan C

    26. September 2010 um 15:34 Uhr


  • Diese Antwort konzentriert sich zu sehr auf den Mechanismus. Die Frage war “Was ist der Garbage Collector”, nicht “Wie funktioniert der Garbage Collector?”

    – Billy ONeal

    26. September 2010 um 15:36 Uhr

  • @quantum: neutralisierte deine -1, weil: Lernen, das heißt, wofür diese Seite ist, richtig? Um zu lernen, muss man Fehler machen. Fehler zu bestrafen führt dazu, dass Menschen nicht lernen. Hoffe, in diesem Punkt können Sie zustimmen. Und vielleicht ist dir hier ein Fehler unterlaufen.

    – erikbstack

    26. September 2010 um 15:39 Uhr


  • @erikb: Nach dieser Logik würde es niemals Downvotes geben. Und Abwertungen sind notwendig, um relativ schlechte Antworten auszusortieren. Das OP ist offensichtlich ein Anfänger, und das spezifische Innenleben des GC ist für die gestellte Frage einfach nicht wichtig. Da diese Antwort die gestellte Frage nicht beantwortet (sie beantwortet eine andere), sind Downvotes vollkommen gerechtfertigt.

    – Billy ONeal

    26. September 2010 um 15:41 Uhr

1646173039 26 Was ist der Garbage Collector in Java
VeKe

Viele Leute denken, dass die Garbage Collection tote Objekte sammelt und entsorgt.

In Wirklichkeit macht die Java Garbage Collection das Gegenteil! Live-Objekte werden verfolgt und alles andere als Müll bezeichnet.

Wenn ein Objekt nicht mehr verwendet wird, fordert der Garbage Collector den zugrunde liegenden Speicher zurück und verwendet ihn für die zukünftige Objektzuordnung wieder. Das heißt, es findet kein explizites Löschen statt und es wird kein Speicher an das Betriebssystem zurückgegeben. Um festzustellen, welche Objekte nicht mehr verwendet werden, führt die JVM zeitweise einen so genannten Mark-and-Sweep-Algorithmus aus.

Überprüfen Sie dies für weitere Detailinformationen:
http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

905420cookie-checkWas ist der Garbage Collector in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy