Grundlegendes zum Finalize()-Aufruf in Java 8
Beim Übergang von Java 7 zu Java 8 ist bei Nachrichtenverarbeitungsanwendungen gelegentlich eine Ausnahme aufgetreten im Zusammenhang mit der Schließung des Baches. Untersuchungen haben unerwartete Aufrufe von finalize() für Objekte, die Streams enthalten, ergeben, was zu deren Schließung während aktiver Lesevorgänge führte.
Dieses zunächst rätselhafte Verhalten kann auf einen kaum verstandenen Aspekt der Garbage Collection zurückgeführt werden. Selbst bei Verweisen auf ein im Stapel vorhandenes Objekt und während aktiver Methodenaufrufe kann ein Objekt immer noch als nicht erreichbar angesehen werden. Dies geschieht, wenn kein nachfolgender Code auf seine Referenz zugreift, wodurch sie „tot“ wird.
Wie in einem vereinfachten Beispiel zu sehen ist, kann ein Objekt auch während der Ausführung einer aktiven Methode finalisiert und Garbage Collection durchgeführt werden:
class FinalizeThis { @Override protected void finalize() { System.out.println("finalized!"); } void loop() { for (int i = 0; i < 1,000,000,000; i++) { // Triggering GC with System.gc() doesn't guarantee garbage collection } } public static void main(String[] args) { new FinalizeThis().loop(); } }
In diesem Beispiel bleibt die Referenz des FinalizeThis-Objekts im Gültigkeitsbereich, ist jedoch aufgrund fehlender weiterer Interaktion damit nicht erreichbar. Folglich ist es für die Finalisierung und anschließende Speicherbereinigung geeignet.
Im gemeldeten Fall wurde das MIMEBodyPart-Objekt möglicherweise in einer lokalen Variablen mit einem m_-Präfix gespeichert, was die Bedingung für potenzielle Unerreichbarkeit erfüllt. Durch Ändern des Speicherorts des Objekts, wie in den Kommentaren vorgeschlagen, wurde das Finalisierungsverhalten beendet.
Es ist erwähnenswert, dass dieses Finalisierungsproblem durch die Einführung einer Kompilierungsanweisung umgangen werden kann. Das Flag -Xcomp erzwingt die Methodenkompilierung vor der Ausführung, sodass der Compiler eine Erreichbarkeitsanalyse durchführen und ungerechtfertigte Finalisierungsaufrufe vermeiden kann.
Das obige ist der detaillierte Inhalt vonWarum lösen finalize()-Aufrufe in Java 8 unerwartet Stream-Schließungen aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!