Was passiert intern (JVM) bei System.gc() oder finalize () - Methode aufgerufen?
Was passiert intern (JVM) bei System.gc() oder finalize () - Methode aufgerufen?
Ist das wirklich Müll aufsammeln oder die Leistung reduzieren ?
- nur Bedenken Sie, dass GC Verhalten, ist von der Implementierung abhängig, so dass es wird sich ändern, über VMs.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Genau das, was passiert, wenn Sie anrufen System.gc() ist JVM abhängig. Die JVM sieht in diesem Aufruf als Vorschlag, dass es könnte eine gute Zeit für die Ausführung der garbage collector, also nicht von ihm abhängen.
Eines Objekts finalize() Methode auf ein Objekt durch den garbage collector, wenn die JVM bestimmt, dass es nicht mehr erreichbar Verweise auf das Objekt. Sie sollte nicht nennen es in Ihrem code. Beachten Sie, dass finalize() ist nicht hieß das damals, wenn Ihr Programm verliert, die endgültige Referenz, aber zu einem späteren Zeitpunkt, wenn der garbage collector ausgeführt wird, so verlassen Sie sich nicht auf, es geschieht an einem bestimmten Punkt in der Zeit (oder überhaupt).
Wenn Sie wissen wollen, garbage collection-Interna, die Sie Lesen sollten, Hotspot-Memory-Management-Whitepaper von Sun.
Durch aufrufen
System.gc()
der garbage collector ausgeführt wird, wie der name schon sagt. An diesem Punkt, wenn die Objekte wirklich entfernt wird, diefinalize()
ist aufgerufen, auf diese Objekte, bevor Sie verschwinden.Die Letzte Frage sollte nicht eine "
or
" in ihm. Es ist die garbage collection und reduzierte Leistung.In der Regel sollten Sie nicht Sorge über
gc
denn es macht einen wirklich guten job für Sie. Gibt es Einsatzszenarien, wo Sie wollen, um loszuwerden, eine Menge von Objekten an einem bestimmten Punkt in der Zeit; Dann ist es machbar.System.gc() den Speicher bereinigt und verwendet finalize (), um loszuwerden, die die einzelnen Objekte.
finalize() ist ein Mittel zur Ausführung der definitiven bit-code, kurz bevor das Objekt ist bereit für die garbage collection ( wenn für das Objekt keine starken Bezug zur it).
Also Wann sollte es verwendet werden?
Nur in zwei Fällen:
gewünschte änderung vorgenommen wird. Zum Beispiel InputStream-Klasse verwendet es
schließen Sie die i/o-stream. Das ist zum Beispiel, Sie haben die
Instanz von BufferedInputStream. Manuell nach mit es eine ist
angenommen, zum schließen() es. Aber da kann man vergessen, das zu tun,
finalize() zu handeln, ist wie ein Sicherheitsnetz, um close() stream.
mit Einheimischen. Weil der garbage collector hat keine Kontrolle über native
Objekte, finalize() kann verwendet werden als ein Mittel, um es zurückfordern.
Abgesehen von den beiden oben genannten Fällen, verwenden Sie es. Um zu verstehen, warum? wir müssen verstehen die Arbeitsweise und den Lebenszyklus eines Objekts.
Einleitung: Es gibt einen separaten daemon-thread aufgerufen, als finalizer thread, die ist verantwortlich für den Aufruf von finalize () - Methode . Finalization queue ist die queu, wo Objekte, die bereit sind aufgerufen zu werden, finalize () - Methode platziert werden.
2a) Wenn nicht dann ist es geschickt, für die garbage collection.
2b) Es hat, dann wird es an der finalization queue. Und es entfernt den Eintrag des Objekts in der Tabelle (1).
Finalizer-thread hält abrufen der Warteschlange. Für jedes Objekt in der Warteschlange, dessen finalize () - Methode aufgerufen wird. Nach dem Aufruf der finalize () - Zyklus aus (2) wird einmal wiederholt. Wenn dieses Objekt noch keine starke Referenz, dann geschickt für GC. Wenn
es hat dann IMMER (2a) wird aufgerufen, da der Eintrag gelöscht wurde, in (2b)
Also was ist das Problem mit den oben genannten Zyklus?
Sie wissen nicht, Wann finalize() aufgerufen wird, da Sie keine Kontrolle über, wenn GC aufgerufen wird. Manchmal kann es passieren, dass Sie drucken den Wert in finalize (), aber der Ausgang wird nie angezeigt, weil das Programm könnte haben beendet durch die Zeit, die finalize() aufgerufen wird.
Daher vermeiden Sie es. Erstellen Sie stattdessen eine Methode sagen, die dispose () - die wird in der Nähe der necessory Ressourcen oder für Letzte Protokoll etc.
der komplette post dazu. Ich hoffe, das klärt.
Ja System.gc(); ausgelöst wird finalize () - Methode, wenn erforderlich.
public class TestGarbageCollection {
}
public class TestClass {
}
Diese auslösen wird finalize () - Methode. ob Sie überschreiben abzuschließen oder nicht abzuschließen Methode der lokalen Klasse oder ein Objekt die finalize aufgerufen wird.
System.gc
nicht garantiert, dass es sofort ruft der Garbage Collector den Speicher frei-up. Es ist nur die Anregung!!!