參考:《深入理解Java虛擬機》
對於Java而言:
調用時機:當垃圾回收器要宣告一個對象死亡時,至少要經過兩次標記過程:如果對象在進行可達性分析后發現沒有和GC Roots相連接的引用鏈,就會被第一次標記,並且判斷是否執行finalizer( )方法,如果對象覆蓋finalizer( )方法且未被虛擬機調用過,那么這個對象會被放置在F-Queue隊列中,並在稍后由一個虛擬機自動建立的低優先級的Finalizer線程區執行觸發finalizer( )方法,但不承諾等待其運行結束。
finalization的目的:對象逃脫死亡的最后一次機會。(只要重新與引用鏈上的任何一個對象建立關聯即可。)但是不建議使用,運行代價高昂,不確定性大,且無法保證各個對象的調用順序。可用try-finally或其他替代。
1)垃圾回收器(garbage collector)決定回收某對象時,就會運行該對象的finalize()方法; 2)GC本來就是內存回收了,應用還需要在finalization做什么呢? 答案是大部分時候,什么都不用做(也就是不需要重載)。只有在某些很特殊的情況下,比如你調用了一些native的方法(一般是C寫的),可以要在finaliztion里去調用C的釋放函數。