Werden Finalizer (und ReferenceQueues) bei JVM-Beendigung ausgeführt? [Duplikat]

8
    

Diese Frage hat hier schon eine Antwort:

    

Ich weiß Sie können nicht auf Finalizer zählen , um sauber zu machen Ihr Chaos (dh freie Ressourcen), aber ich frage mich - erhalten Java-Objekte GC / beendet, wenn die JVM normalerweise endet ( System.exit() / keine Threads übrig)?

BEARBEITEN:

Es wird also nicht garantiert, dass der GC ausgelöst wird, also auch finalize() , aber funktioniert ReferenceQueue?

    
Elist 06.08.2013, 06:18
quelle

1 Antwort

6

Für einige Zeit gab es eine Methode Runtime.runFinalizersOnExit , die mit dem Argument true aufgerufen werden konnte, um sicherzustellen, dass alle Objekte abgeschlossen waren, bevor die VM heruntergefahren wurde. Diese Methode wird nun aus Gründen abgelehnt, die in der Java-Dokumentation unter Ссылка ganz unten auf der Seite. Dies ist der relevante Abschnitt:

  

Warum ist Runtime.runFinalizersOnExit veraltet?

     

Weil es von Natur aus unsicher ist. Es kann dazu führen, dass Finalizer auf Live-Objekten aufgerufen werden, während andere Threads diese Objekte gleichzeitig manipulieren, was zu fehlerhaftem Verhalten oder Deadlock führt. Obwohl dieses Problem verhindert werden könnte, wenn die Klasse, deren Objekte gerade finalisiert werden, codiert wurde, um sich gegen diesen Aufruf "zu verteidigen", wehren sich die meisten Programmierer nicht dagegen. Sie nehmen an, dass ein Objekt zu dem Zeitpunkt tot ist, an dem sein Finalizer aufgerufen wird.

     

Außerdem ist der Aufruf nicht "Thread-sicher" in dem Sinne, dass er ein VM-Global-Flag setzt. Dies zwingt jede Klasse mit einem   Finalizer zum Schutz gegen die Finalisierung von Live-Objekten!

Nun, da diese Methode veraltet ist, gibt es keinerlei Möglichkeit, die Fertigstellung des Objekts zu garantieren. Ob und wann ein Objekt auf Müll gesammelt wird, liegt völlig an der JVM.

    
tbodt 06.08.2013 06:29
quelle