In Java wird finalize
für ein Objekt (das es überschreibt) aufgerufen, wenn es um die Garbage Collection geht, also wenn es nicht erreichbar ist. Was aber, wenn der Finalizer das Objekt wieder erreichbar macht, was passiert dann?Was passiert, wenn ein Finalizer ein Objekt erreichbar macht?
Antwort
Das Objekt wird nicht gesammelt, bis es wieder nicht erreichbar ist.
Gemäß JavaDoc wird finalize() nicht erneut aufgerufen.
Ja, deshalb verwenden Sie keine Finalizer (Nun, einer der vielen Gründe).
Es gibt eine Referenzsammlung, die dafür gemacht wird. Ich werde es nachschlagen und es hier in einer Sekunde posten, aber ich denke es ist PhantomReference.
Yep, PhantomReference:
Phantom Referenzobjekte, die nach dem Kollektor die Warteschlange gestellt werden, bestimmt, dass ihre referents sonst zurückgewonnen werden kann. Phantomreferenzen werden am häufigsten dazu verwendet, Pre-Mortem-Bereinigungsaktionen flexibler zu planen, als dies mit dem Java-Finalisierungsmechanismus möglich ist.
Wenn Sie die API-Beschreibung sorgfältig lesen, sehen Sie, dass der Finalizer das Objekt wieder erreichbar machen kann. Das Objekt wird erst verworfen, wenn es (wieder) nicht erreichbar ist, aber finalize()
wird nicht mehr als einmal aufgerufen.
Tatsächlich macht der Finalizer * das Objekt über einen verwurzelten Verweis zwischen der Zeit, zu der das Objekt nicht erreichbar ist, und dem Zeitpunkt, zu dem es ausgeführt wird, stark erreichbar. Wenn während dieser Zeit das Objekt, das als unerreichbar befunden wurde, der einzige überlebende Verweis auf ein anderes Objekt ist, wird dieses andere Objekt nicht gesammelt werden können, bis der Finalizer ausgeführt oder die Referenz auf andere Weise ungültig gemacht wird. – supercat
Dann wird das Objekt im Grunde genommen nicht Müll gesammelt. Dies nennt man Object Resurrection. Führen Sie eine Suche nach diesem Begriff durch, und Sie sollten eine Reihe interessanter Artikel erhalten. Wie Jim erwähnte, ist ein wichtiger Punkt, dass der Finalizer nur einmal ausgeführt wird.
Es wird tatsächlich ein weiterer Durchgang durchgeführt, um zu überprüfen, dass keine Referenzen mehr auf das Objekt vorhanden sind. Da dieser Test beim zweiten Durchlauf fehlschlägt, wird der Speicher für das Objekt nicht freigegeben.
Da finalize nur ein einziges Mal für ein bestimmtes Objekt aufgerufen wird, wird das nächste Mal, wenn es keine Referenzen hat, nur den Speicher freigeben, ohne finalize aufzurufen. Einige gute Informationen here bei Finalisierung.
- 1. Was passiert genau, wenn const auf ein lokales Objekt verweist?
- 2. Was passiert, wenn ein Prozess gespalten wird?
- 3. Was passiert, wenn ein Ereignis ausgelöst wird
- 4. Was passiert, wenn wir ein Objekt deklarieren und zuweisen auf ein anderes Objekt der gleichen Klasse
- 5. Was passiert, wenn der UDP-Server nicht erreichbar ist
- 6. Android - Was passiert, wenn ein Signaturschlüssel abläuft?
- 7. Was passiert, wenn ein Trigger fehlschlägt?
- 8. Was passiert, wenn Sie ein Programm ausführen?
- 9. Was macht ein i2c_new_dummy?
- 10. Was macht ein IISReset?
- 11. Was macht ein Gradlew?
- 12. Was passiert genau, wenn Sie ein Backbone-Modell speichern?
- 13. Was passiert, wenn NSTimer in
- 14. Was macht Objekt (this)?
- 15. Was passiert, wenn ein finally-Block eine Ausnahme auslöst?
- 16. Was passiert in der Maschine, wenn ich ein Signal sende
- 17. Open MPI/MPICH - Was passiert, wenn ein Knoten terminiert?
- 18. Was passiert, wenn ich ein Modul in OctoberCMS deaktiviere?
- 19. Was passiert mit Sockets, wenn ich ein Netzwerkkabel abziehe?
- 20. Was passiert, wenn ein Schreibvorgang auf localStorage abgebrochen wird?
- 21. Was passiert, wenn ein TCP-Handshake-Segment verloren geht?
- 22. Was passiert, wenn ein Thread eine Exception auslöst?
- 23. Was passiert, wenn ein Framework aus einer App gelöscht wird?
- 24. Was passiert mit anderen Threads, wenn ein Thread sich verzweigt()?
- 25. Was passiert, wenn ein DDOS-Angriff Windows Azure-Websites erreicht?
- 26. Was passiert, wenn ein .NET-Thread eine Ausnahme auslöst?
- 27. Was passiert in der x86-Architektur, wenn ein Interrupt auftritt?
- 28. Was passiert, wenn ein Browser gzip nicht unterstützt?
- 29. Was passiert, wenn Sie ein Merkmal in PHP "Require"?
- 30. Was genau macht ein TestNG Thread Count?
Nein, es ist ein Grund, nicht einen sehr kaputten Finalisierer zu schreiben (wenn es nicht genug andere Gründe gab). –