finalize()方法什么時候被調用?析構函數(finalization)的目的是什么?


鏈接: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的釋放函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM