Gc如何判斷對象可以被回收?
1 引用計數器:每一個對象有一個引用屬性,新增一個引用時加一,引用釋放時減一,計數為0的時候可以回收。
2 可達性分析:從GcRoot開始向下搜索,搜索所走過的路徑被稱為引用鏈,當一個對象到GcRoot沒有任何引用鏈相連時,則證明此對象是不可用的,那么虛擬機就可以判定回收。
什么是GcRoot?
GcRoot 的對象有:
1 虛擬機棧中引用的對象
2 方法區中靜態屬性引用的對象。
3 方法區中常量引用的對象
4 本地方法棧中(即一般說的native方法)引用的對象
可達性算法中的不可達對象並不是立即死亡的,對象擁有一次自我拯救的機會,對象被系統宣告
死亡至少要經理兩次標記過程,第一次是經過可達性分析發現沒有與GcRoots 相連接的引用鏈,第二次是由
虛擬機自動簡歷的Finalizer隊列中判斷是否需要執行finalize()方法。
當對象變成GcRoot不可達時,Gc會判斷該對象是否覆蓋了finalize方法,若未覆蓋,則直接回收,
否則,若對象未執行過finalize方法,將其放入F-Queue隊列,由一低優先級線程執行該隊列中對象的finalize方法。
執行每個對象只能觸發一次的finalize方法。
由於finalize方法運行代價高昂,不確定性大,無法保證各個對象調用順序,不推薦使用。