? ? ? ? 接著垃圾收集--判斷對象是否存活(1) - 簡書扒秸、垃圾收集--引用(2) - 簡書上面這兩篇論述盐捷,我們接著討論對象是否存活的問題孽江。
? ? ? ? 要真正宣告一個對象的死亡门坷,至少要經(jīng)歷兩次標記過程宣鄙;所以在根搜索算法中不可到達的對象并不一定是“非死不可”的。
? ? ? ? 兩次標記過程:
? ? ? ? ? ? ? (1)對象在進行根搜索后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,它將會被第一次標記并進行一次篩選默蚌,篩選的條件是此對象是否有必要執(zhí)行finalize()方法冻晤。(當對象沒有覆蓋finalize()方法或者finalize()方法已經(jīng)被虛擬機調用過,虛擬機將這兩種情況都視為“沒有必要執(zhí)行”敏簿。)
? ? ? ? ? ? ? ? ?(2)篩選后被判定為有必要執(zhí)行finalize()方法后明也,此對象會被放在一個名為F-Queue的隊列里面,并稍后會由一條虛擬機自動建立的惯裕,低優(yōu)先級的Finalizer線程去觸發(fā)這個finalize()方法(但并不承諾會等待此方法運行結束,原因是防止導致內存系統(tǒng)崩潰)绣硝。
? ? ? ? ? ? ? ? ?(3)在執(zhí)行finalize()方法前蜻势,會對F-Queue里的對象進行第二次小規(guī)模的標記,若對象在第二次標記前成功的重新與引用鏈上的任意對象建立了關聯(lián)(例如把自己賦值給某個變量或對象的成員變量)鹉胖,它就會在第二次標記時被移出“即將回收”集合握玛。否則,將會被第二次標記(即意味著死亡)甫菠。
? ? ? ?但在Java中關于對象死亡時的finalize()方法是不建議使用的挠铲,因為它的運行代價高,不確定性大寂诱。而且finalize()方法能做的所有工作拂苹,使用try-finally或其它方式可以做到更好更及時。