it-swarm.com.de

Was ist der Garbage Collector in Java?

Ich bin neu in Java und verwirrt über den Garbage Collector in Java. Was macht er eigentlich und wann kommt er in Aktion. Bitte beschreiben Sie einige Eigenschaften des Garbage Collector in Java.

99

Der Garbage Collector ist ein Programm, das auf der Java Virtual Machine ausgeführt wird und Objekte beseitigt, die von einer Java Anwendung) nicht verwendet werden Es ist eine Form der automatischen Speicherverwaltung .

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

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

Im obigen Code wird das String s wird bei jeder Iteration der for-Schleife erstellt. Dies bedeutet, dass in jeder Iteration ein wenig Speicher zugewiesen wird, um ein String -Objekt zu erstellen.

Zurück zum Code: Sobald eine einzelne Iteration ausgeführt wurde, wird das in der vorherigen Iteration erstellte String -Objekt in der nächsten Iteration nicht mehr verwendet. Dieses Objekt wird nun als "" betrachtet. Müll".

Irgendwann werden wir viel Müll bekommen und Speicher wird für Objekte verwendet, die nicht mehr verwendet werden. Wenn dies so weitergeht, wird der Java Virtual Machine möglicherweise nicht mehr genügend Speicherplatz zur Verfügung stehen, um neue Objekte zu erstellen.

Hier kommt der Müllmann ins Spiel.

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

In Java wird die Speicherverwaltung vom Garbage Collector übernommen. In anderen Sprachen wie C muss die Speicherverwaltung jedoch mithilfe von Funktionen wie malloc und free . Speicherverwaltung ist eines der Dinge, die leicht zu Fehlern führen, was zu sogenannten Speicherlecks - Orten führen kann, an denen Speicher nicht zurückgewonnen wird, wenn sie nicht vorhanden sind mehr verwenden.

Dank automatischer Speicherverwaltungsschemata wie Garbage Collection muss sich der Programmierer nicht so sehr um Speicherverwaltungsprobleme kümmern, sondern kann sich mehr auf die Entwicklung der Anwendungen konzentrieren, die er entwickeln muss.

115
coobird

Es gibt Speicher frei, der Objekten zugewiesen ist, die nicht mehr vom Programm verwendet werden - daher der Name "Müll". Beispielsweise:

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ß, dass dies sehr aufwendig ist, aber hier, nachdem Sie otherMethod() aufgerufen haben, wird das ursprünglich erstellte Object unerreichbar gemacht - und das ist "Müll", durch den Müll gesammelt wird.

In Java) läuft der GC automatisch, Sie können ihn aber auch explizit mit System.gc() und versuchen Erzwinge eine große Garbage Collection. Wie Pascal Thivent hervorhebt, solltest du das wirklich nicht tun und es könnte mehr schaden als nützen (siehe diese Frage ).

Weitere Informationen finden Sie im Wikipedia-Eintrag zu Garbage Collection und Tuning Garbage Collection (von Oracle).

18

Ein Objekt wird für die Garbage Collection oder GC in Betracht gezogen, wenn es nicht über Live-Threads oder über statische Verweise erreichbar ist.

Mit anderen Worten, Sie können sagen, dass ein Objekt für die Garbage Collection in Frage kommt, 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, sind beide Objekte A und B für die Garbage Collection berechtigt.


Heap-Generationen für Garbage Collection -

Java-Objekte werden in Heap erstellt und Heap ist zwecks Garbage Collection in Java in drei Teile oder Generationen unterteilt. Diese heißen Young (New) Generation, Tenured (Old) Generation und Perm Area des Haufens.

Java Heap SpaceNew Generation ist weiter in drei Teile unterteilt, die als Eden-Raum bekannt sind, den Raum für Überlebende 1 und den Raum für Überlebende 2. Wenn ein Objekt, das zuerst auf einem Haufen erstellt wurde, innerhalb des Eden-Raums in einer neuen Generation erstellt wird und nach der anschließenden kleinen Speicherbereinigung, wenn ein Objekt überlebt, auf Überlebende 1 und dann auf Überlebende 2 verschoben wird, bevor die große Speicherbereinigung dieses Objekt auf alt oder feste Generation.

Perm space of Java Heap ist der Speicherort von JVM-Metadaten zu Klassen und Methoden, String-Pool und Details zur Klassenebene.

Heap Generations for Garbage Collection

Weitere Informationen finden Sie hier: Garbage Collection


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

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ückfordern und den Speicherplatz dem Programm wieder zur Verfügung stellen.

Die obigen Operationen werden vom Markierungs- und Wobbelalgorithmus in zwei Phasen ausgeführt:

  1. Phase markieren
  2. Sweep-Phase

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

14
roottraveller

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

6
Nik

Garbage Collector ist Teil von JRE, das sicherstellt, dass nicht referenzierte Objekte aus dem Arbeitsspeicher entfernt werden.
Es wird normalerweise ausgeführt, wenn in Ihrer App nicht mehr genügend Arbeitsspeicher vorhanden ist. AFAIK enthält ein Diagramm, das die Verknüpfungen zwischen den Objekten darstellt, und isolierte Objekte können freigegeben werden.
Um die Leistung der aktuellen Objekte, die in Generationen gruppiert sind, zu sichern, wird jedes Mal, wenn GC ein Objekt scannt und feststellt, dass es immer noch referenziert wird, die Generationsanzahl um 1 erhöht (auf einen maximalen Wert, 3 oder 4, denke ich), und Die neue Generation wird zuerst gescannt (je kürzer das Objekt im Speicher ist, desto wahrscheinlicher ist es, dass es nicht mehr benötigt wird), sodass nicht bei jedem GC-Lauf alle Objekte gescannt werden.
lies this für mehr Informationen.

6
Itay Karo

Viele Leute denken, dass die Müllabfuhr tote Gegenstände sammelt und wegwirft.
In der Realität ist Java Garbage Collection das Gegenteil! Live-Objekte werden verfolgt und alles andere als Müll bezeichnet.

Wenn ein Objekt nicht mehr verwendet wird, greift der Garbage Collector auf den zugrunde liegenden Speicher zurück und verwendet ihn für die zukünftige Objektzuweisung. Dies bedeutet, dass keine explizite Löschung erfolgt und kein Speicher an das Betriebssystem zurückgegeben wird. 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 Informationen: http://javabook.compuware.com/content/memory/how-garbage-collection-works.aspx

3
VdeX

Mit dem Garbage Collector kann Ihr Computer einen Computer mit unbegrenztem Speicher simulieren. Der Rest ist nur ein Mechanismus.

Dies geschieht, indem festgestellt wird, wenn in Ihrem Code nicht mehr auf Speicherbereiche zugegriffen werden kann, und diese Bereiche an den freien Speicher zurückgegeben werden.

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

3
Billy ONeal

Einfach ausgedrückt, wenn ein Programm Daten verarbeitet, erstellt es Zwischendaten und Speicherplatz (Variablen, Arrays, bestimmte Objektmetadaten usw.) für diese Daten, die auch ein Nicht-Programmierer verstehen kann.

Wenn auf diese Objekte funktionsübergreifend oder ab einer bestimmten Größe zugegriffen wird, werden sie von einem zentralen Heap zugeordnet. Wenn sie dann nicht mehr gebraucht werden, müssen sie aufgeräumt werden.

Es gibt einige sehr gute Artikel online darüber, wie dies funktioniert, daher werde ich nur die grundlegende Definition behandeln.

Der GC ist im Grunde die Funktion, die diese Bereinigung vornimmt. Zu diesem Zweck werden Tabelleneinträge gelöscht, auf die von keinem aktiven Objekt verwiesen wird, und die Objekte werden effektiv gelöscht. Anschließend wird der Speicher kopiert und komprimiert. Es ist ein bisschen komplizierter als das, aber Sie bekommen die Idee.

Das große Problem besteht darin, dass für einige Teile dieses Prozesses häufig der gesamte Java VM) erforderlich ist, um vorübergehend gestoppt zu werden, und dass dieser gesamte Prozess sehr umfangreich ist Prozessor- und Speicherbandbreitenintensiv: Die verschiedenen Optionen der GCs und Optimierungsoptionen für jeden einzelnen sind darauf ausgelegt, diese verschiedenen Probleme mit dem gesamten GC-Prozess in Einklang zu bringen.

Der Garbage Collector kann als Referenzzähler-Manager angesehen werden. Wenn ein Objekt erstellt und seine Referenz in einer Variablen gespeichert wird, wird die Referenzanzahl um eins erhöht. während der Ausführung, wenn diese Variable mit NULL belegt ist. Der Referenzzähler für dieses Objekt wird dekrementiert. Daher ist der aktuelle Referenzzähler für das Objekt 0. Wenn der Garbage Collector ausgeführt wird, sucht er nach den Objekten mit dem Referenzzähler 0. und gibt die ihm zugewiesenen Ressourcen frei.

Der Garbage Collector-Aufruf wird durch Garbage Collection-Richtlinien gesteuert.

Hier können Sie einige Daten abrufen. http://www.Oracle.com/technetwork/Java/gc-tuning-5-138395.html

0
bala sreekanth

Die Grundprinzipien der Speicherbereinigung bestehen darin, Datenobjekte in einem Programm zu finden, auf die in Zukunft nicht mehr zugegriffen werden kann, und die von diesen Objekten verwendeten Ressourcen zurückzugewinnen. https://en.wikipedia.org/wiki/Garbage_collection_%28computer_science%29

Vorteile

1) Speichert vor Fehlern, die auftreten, wenn ein Teil des Speichers freigegeben wird, während noch Zeiger darauf vorhanden sind, und einer dieser Zeiger dereferenziert wird. https://en.wikipedia.org/wiki/Dangling_pointer

2) Doppelte freie Fehler, die auftreten, wenn das Programm versucht, einen Bereich des Speichers freizugeben, der bereits freigegeben und möglicherweise bereits wieder zugewiesen wurde.

3) Verhindert bestimmte Arten von Speicherverlusten, bei denen ein Programm den von nicht erreichbaren Objekten belegten Speicher nicht mehr freigibt, was zu Speichermangel führen kann.

Nachteile

1) Verbrauch zusätzlicher Ressourcen, Auswirkungen auf die Leistung, mögliche Verzögerungen bei der Programmausführung und Inkompatibilität mit der manuellen Ressourcenverwaltung. Die Speicherbereinigung verbraucht Rechenressourcen, um zu entscheiden, welcher Speicher freigegeben werden soll, obwohl der Programmierer diese Informationen möglicherweise bereits kennt.

2) Der Moment, in dem der Müll tatsächlich gesammelt wird, kann unvorhersehbar sein, was zu Unterbrechungen (Unterbrechungen der Verschiebung/Freigabe des Speichers) führt, die während einer Sitzung verstreut sind. Unvorhersehbare Verzögerungen können in Echtzeitumgebungen, bei der Transaktionsverarbeitung oder in interaktiven Programmen unannehmbar sein.


Oracle-Tutorial http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html

Garbage Collection ist der Vorgang, bei dem festgestellt wird, welche Objekte verwendet werden und welche nicht, und die nicht verwendeten Objekte gelöscht werden.

In Programmiersprachen wie C, C++ ist das Zuweisen und Freigeben von Speicher ein manueller Vorgang.

int * array = new int[size];
processArray(array); //do some work.
delete array; //Free memory

Der erste Schritt in diesem Prozess heißt Markieren. Hier erkennt der Garbage Collector, welche Speicherbereiche verwendet werden und welche nicht.

Schritt 2a. Beim normalen Löschen werden nicht referenzierte Objekte entfernt, sodass referenzierte Objekte und Zeiger auf den freien Speicherplatz verbleiben.

Um die Leistung zu verbessern, möchten wir nicht referenzierte Objekte löschen und die verbleibenden referenzierten Objekte komprimieren. Wir wollen referenzierte Objekte zusammenhalten, damit es schneller geht, neuen Speicher zuzuweisen.

Wie bereits erwähnt, ist es ineffizient, alle Objekte in einer JVM markieren und komprimieren zu müssen. Je mehr Objekte zugewiesen werden, desto länger wird die Liste der Objekte, was zu einer immer längeren Speicherbereinigungszeit führt.

Lesen Sie dieses Tutorial weiter und erfahren Sie, wie GC diese Herausforderung annimmt.

Kurz gesagt, es gibt drei Regionen des Heaps, YoungGeneration für Objekte mit kurzer Lebensdauer, OldGeneration für Objekte mit langer Laufzeit und PermanentGeneration für Objekte, die während der Lebensdauer der Anwendung vorhanden sind, z. B. Klassen, Bibliotheken.

0
Yan Khonski

Garbage Collection bezieht sich auf den Vorgang des automatischen Freigebens von Speicher auf dem Heap, indem Objekte gelöscht werden, die in Ihrem Programm nicht mehr erreichbar sind. Der Heap ist ein Speicher, der als freier Speicher bezeichnet wird. Er stellt einen großen Pool von nicht verwendetem Speicher dar, der Ihrer Java) - Anwendung zugewiesen ist.

0
Aamir M Meman

Bei der automatischen Garbage Collection wird der Heap-Speicher überprüft, welche Objekte verwendet werden und welche nicht, und die nicht verwendeten Objekte werden gelöscht. Ein in Gebrauch befindliches Objekt oder ein Objekt, auf das verwiesen wird, bedeutet, dass ein Teil Ihres Programms weiterhin einen Zeiger auf dieses Objekt verwaltet. Ein nicht verwendetes Objekt oder ein nicht referenziertes Objekt wird von keinem Teil Ihres Programms mehr referenziert. So kann der von einem nicht referenzierten Objekt verwendete Speicher zurückgewonnen werden.

In einer Programmiersprache wie C ist das Zuweisen und Freigeben von Speicher ein manueller Vorgang. In Java wird die Freigabe des Speichers automatisch vom Garbage Collector durchgeführt. Bitte überprüfen Sie den Link für ein besseres Verständnis. http://www.Oracle.com/webfolder/technetwork/tutorials/obe/Java/gc01/index.html

Der Garbage Collector ist eine Komponente von jvm.

Es wird verwendet, um Müll zu sammeln, wann immer die CPU frei wird.

Hier bedeutet Müll nicht verwendete Objekte, die im Hintergrund des Hauptprogramms ausgeführt werden

um den Status des Hauptprogramms zu überwachen.

0

Da Objekte vom Operator new dynamisch zugewiesen werden, können Sie fragen, wie diese Objekte zerstört werden und wie viel Speicher freigegeben wird. In anderen Sprachen wie C++ müssen Sie manuell zugewiesene Objekte dynamisch vom Löschoperator freigeben. Java hat einen anderen Ansatz; es behandelt automatisch die Freigabe. Die Technik ist bekannt als Garbage Collection.

Dies funktioniert folgendermaßen: Wenn keine Referenzen zu einem Objekt vorhanden sind, wird davon ausgegangen, dass dieses Objekt nicht mehr benötigt wird, und Sie können den vom Objekt belegten Speicher abrufen. Es ist nicht notwendig, Objekte wie in C++ explizit zu zerstören. Die Speicherbereinigung erfolgt sporadisch während der Programmausführung. Es passiert nicht einfach, weil es ein oder mehrere Objekte gibt, die nicht mehr verwendet werden. Darüber hinaus haben mehrere Java Laufzeitimplementierungen unterschiedliche Ansätze für die Garbage Collection, aber die meisten Programmierer müssen sich beim Schreiben von Programmen nicht darum kümmern.

0
Amarildo

Garbage Collection in Java (und auch in anderen Sprachen/Plattformen) ist eine Möglichkeit für die Java-Laufzeitumgebung (JRE), Speicher aus Java Objekten wiederzuverwenden das werden nicht mehr benötigt. Vereinfacht gesagt, fragt das JRE beim ersten Start das Betriebssystem (O/S) nach einer bestimmten Speichermenge. Während die JRE Ihre Anwendung (en) ausführt, verwendet sie diesen Speicher. Wenn Ihre Anwendung mit diesem Speicher fertig ist, wird der "Garbage Collector" der JRE bereitgestellt und verwendet diesen Speicher für verschiedene Teile Ihrer vorhandenen Anwendung (en). Der "Garbage Collector" der JRE ist eine Hintergrundaufgabe, die ständig ausgeführt wird und versucht, Zeiten zu ermitteln, in denen das System nicht in Betrieb ist, um die Garbage Runs auszuführen.

Eine echte Analogie wären die Müllmänner, die zu Ihnen nach Hause kommen und Ihren wiederverwertbaren Müll einsammeln. Schließlich wird er von Ihnen und/oder anderen Personen auf andere Weise wiederverwendet.

0
Al Dass