連接:https://www.nowcoder.com/questionTerminal/d8eab06913084e42b515633604eef7cd?pos=28&mutiTagIds=570&orderByHotValue=0&done=0
來源:牛客網
函數
參考:《深刻理解Java虛擬機》
對於Java而言:
調用時機:當垃圾回收器要宣告一個對象死亡時,至少要通過兩次標記過程:若是對象在進行可達性分析後發現沒有和GC Roots相鏈接的引用鏈,就會被第一次標記,而且判斷是否執行finalizer( )方法,若是對象覆蓋finalizer( )方法且未被虛擬機調用過,那麼這個對象會被放置在F-Queue隊列中,並在稍後由一個虛擬機自動創建的低優先級的Finalizer線程區執行觸發finalizer( )方法,但不承諾等待其運行結束。
finalization的目的:對象逃脫死亡的最後一次機會。(只要從新與引用鏈上的任何一個對象創建關聯便可。)可是不建議使用,運行代價高昂,不肯定性大,且沒法保證各個對象的調用順序。可用try-finally或其餘替代。
1)垃圾回收器(garbage collector)決定回收某對象時,就會運行該對象的finalize()方法; 2)GC原本就是內存回收了,應用還須要在finalization作什麼呢? 答案是大部分時候,什麼都不用作(也就是不須要重載)。只有在某些很特殊的狀況下,好比你調用了一些native的方法(通常是C寫的),能夠要在finaliztion裏去調用C的釋放函數。