二次標記
針對這個問題,虛擬機的做法是進行兩次標記,即第一次標記不在“關系網”中的對象。第二次的話就要先判斷該對象有沒有實現finalize()方法了,如果沒有實現就直接判斷該對象可回收;如果實現了就會先放在一個隊列中,並由虛擬機建立的一個低優先級的線程去執行它,隨后就會進行第二次的小規模標記,在這次被標記的對象就會真正的被回收了。
finalize()在什么時候被調用?
有三種情況
1.所有對象被Garbage Collection時自動調用,比如運行System.gc()的時候.
2.程序退出時為每個對象調用一次finalize方法。
3.顯式的調用finalize方法
舉例說明