Wann wird die finalize()
Methode in Java aufgerufen?
Die Finalize-Methode wird aufgerufen, nachdem der GC festgestellt hat, dass das Objekt nicht mehr erreichbar ist, und bevor der vom Objekt verwendete Speicher tatsächlich zurückgefordert wird.
Wenn ein Objekt niemals unerreichbar wird, finalize()
wird es niemals aufgerufen.
Wenn der GC nicht ausgeführt wird, wird er finalize()
möglicherweise nie aufgerufen. (Normalerweise wird der GC nur ausgeführt, wenn die JVM entscheidet, dass wahrscheinlich genug Müll vorhanden ist, damit es sich lohnt.)
Es kann mehr als einen GC-Zyklus dauern, bis der GC feststellt, dass ein bestimmtes Objekt nicht erreichbar ist. (Java-GCs sind normalerweise "Generationskollektoren" ...)
Sobald der GC feststellt, dass ein Objekt nicht erreichbar und finalisierbar ist, wird es in eine Finalisierungswarteschlange gestellt. Die Finalisierung erfolgt normalerweise asynchron mit dem normalen GC.
(Die JVM-Spezifikation erlaubt einer JVM tatsächlich , niemals Finalizer auszuführen ... vorausgesetzt, sie beansprucht nicht den von den Objekten verwendeten Speicherplatz zurück. Eine auf diese Weise implementierte JVM wäre verkrüppelt / nutzlos, aber dieses Verhalten ist "erlaubt". .)
Das Ergebnis ist, dass es unklug ist, sich auf die Finalisierung zu verlassen, um Dinge zu tun, die in einem bestimmten Zeitrahmen erledigt werden müssen. Es ist "Best Practice", sie überhaupt nicht zu verwenden. Es sollte einen besseren (dh zuverlässigeren) Weg geben, um das zu tun, was Sie mit der finalize()
Methode versuchen .
Die einzige legitime Verwendung für die Finalisierung besteht darin, Ressourcen zu bereinigen, die mit Objekten verknüpft sind, die durch Anwendungscode verloren gegangen sind. Selbst dann sollten Sie versuchen, den Anwendungscode so zu schreiben, dass die Objekte überhaupt nicht verloren gehen. (Verwenden Sie beispielsweise Java 7+ Try-with-Resources, um sicherzustellen, dass dies close()
immer aufgerufen wird ...)
Ich habe eine Testklasse erstellt, die in eine Datei schreibt, wenn die finalize () -Methode durch Überschreiben aufgerufen wird. Es wird nicht ausgeführt. Kann mir jemand den Grund sagen, warum es nicht ausgeführt wird?
Es ist schwer zu sagen, aber es gibt einige Möglichkeiten:
- Das Objekt wird nicht durch Müll gesammelt, da es noch erreichbar ist.
- Das Objekt wird nicht durch Müll gesammelt, da der GC nicht ausgeführt wird, bevor Ihr Test abgeschlossen ist.
- Das Objekt wird vom GC gefunden und vom GC in die Finalisierungswarteschlange gestellt. Die Finalisierung wird jedoch nicht abgeschlossen, bevor Ihr Test abgeschlossen ist.