GC如何判斷對象可以被回收
- 引用計數(shù)法:每個對象有一個引用計數(shù)屬性,新增一個引用時計數(shù)加1,引用釋放時計數(shù)減1,計數(shù)為0時可以回收,
- 可達性分析法:從 GC Roots 開始向下搜索,搜索所走過的路徑稱為引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證明此對象是不可用的,那么虛擬機就判斷是可回收對象。
引用計數(shù)法,可能會出現(xiàn)A引用了 B,B 又引用了A,這時候就算他們都不再使用了,但因為相與引用計數(shù)器=1 永遠無法被回收
GC Roots的對象有:
- 虛擬機棧(棧幀中的本地變量表)中引用的對象.
- 方法區(qū)中類靜態(tài)屬性引用的對象
- 方法區(qū)中常量引用的對象
- 本地方法棧中NI即一般說的Native方法)引用的對象
可達性算法中的不可達對象并不是立即死亡的,對象擁有一次自我拯救的機會。對象被系統(tǒng)宣告死亡至少要經歷兩次標記過程:第一次是經過可達性分析發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,第二次是在由虛擬機自動建立的Finalizer隊列中判斷是否需要執(zhí)行finalize()方法。
當對象變成(GC Roots)不可達時,GC會判斷該對象是否覆蓋了finalize方法,若未覆蓋,則直接將其回收。否則,若對象未執(zhí)行過finalize方法,將其放入F-Queue隊列,由一低優(yōu)先級線程執(zhí)行該隊列中對象的finalize方法。執(zhí)行finalize方法完畢后,GC會再次判斷該對象是否可達,若不可達,則進行回收,否則,對象”復活”文章來源:http://www.zghlxwxcb.cn/news/detail-566165.html
每個對象只能觸發(fā)一次finalize()方法
由于finalize()方法運行代價高昂,不確定性大,無法保證各個對象的調用順序,不推薦大家使用,建議遺忘它。文章來源地址http://www.zghlxwxcb.cn/news/detail-566165.html
到了這里,關于16、GC如何判斷對象可以被回收的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!