Heim > Java > javaLernprogramm > Warum lösen finalize()-Aufrufe in Java 8 unerwartet Stream-Schließungen aus?

Warum lösen finalize()-Aufrufe in Java 8 unerwartet Stream-Schließungen aus?

Susan Sarandon
Freigeben: 2024-12-14 09:46:25
Original
382 Leute haben es durchsucht

Why Are finalize() Calls Unexpectedly Triggering Stream Closures in Java 8?

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();
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage