天天看點

Java魔法堂:finalize函數

一、finalize與gc                            

  在gc第一次進行可達性分析時會将不可達而且該對象所屬類重寫finalize方法和finalize方法重未被執行過的

對象追加到f-queue當中,然後jvm會自動開啟一個低優先級的守護線程finalizer執行f-queue中元素的finalize方法。此時可

通過finalize方法重新将不可達對象與引用鍊關聯起來,那麼在gc第二次進行可達性分析時,則可逃離被回收的名單。

第一次成功通過finalize方法成功逃脫回收名單,但第二次因為finalize方法之前已經被調用過,是以不會在執行finalize方法,是以注定被回收了。

注意:finalizer線程執行每個對象的finalize方法時是非阻塞的,是以并不保證gc進行第二次标記時finalize方法執行完成。

二、在finalize方法中釋放資源?                   

說起finalize方法大家就會聯想到析構函數,并希望像析構函數那樣使用,然後什麼資源釋放收尾等工作都放在finalize方法中。其實這隻是讓

c/c++程式員更容易轉向java陣營的妥協而已,大家最好還是忘記有這一個方法吧,通過try-catch-finally釋放資源更有效。