2010-09-27 6 views

Antwort

9

Das Objekt wird nicht gesammelt, bis es wieder nicht erreichbar ist.

Gemäß JavaDoc wird finalize() nicht erneut aufgerufen.

3

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.

+0

Nein, es ist ein Grund, nicht einen sehr kaputten Finalisierer zu schreiben (wenn es nicht genug andere Gründe gab). –

7

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.

+0

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

10

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.

3

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.

Verwandte Themen