對象已死嗎?

在Java垃圾回收之前,需要判斷對象是不是已經(jīng)死掉,只有死掉的對象才能被GC回收,那么如何判斷一個(gè)對象是不是已經(jīng)死掉了呢?

一. 引用計(jì)數(shù)法

1. 給對象添加一個(gè)引用計(jì)數(shù)器,每當(dāng)有一個(gè)對象引用它時(shí)+1,當(dāng)引用失效時(shí)-1,任何時(shí)刻計(jì)數(shù)器為0的對象就是不可能再被引用的。

2. 實(shí)現(xiàn)簡單,效率很高,但很難解決對象之間循環(huán)引用的問題。

二. 可達(dá)性分析

1. 基本思想:通過一系列稱為GC Roots的對象作為起始點(diǎn),從這些點(diǎn)向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個(gè)對象到GC Roots沒有任何引用鏈相連時(shí),此對象不可達(dá)。

2. 在Java中可以作為GC Roots的對象包括以下幾種:虛擬機(jī)棧中引用的對象;方法區(qū)中類靜態(tài)屬性引用的對象;方法區(qū)中常量引用的對象;本地方法中JNI(Native方法)引用的對象。

三. 引用

1. 引用分為四種:強(qiáng)引用,軟引用,弱引用,虛引用,強(qiáng)度逐漸減弱。

2. 強(qiáng)引用就是程序代碼中普遍存在的引用。

3. 軟引用是用來描述一些還有用但并非必須的對象。

4. 弱引用也是用來描述非必需對象的,被弱引用關(guān)聯(lián)的對象只能生存到下一次垃圾收集發(fā)生之前。

5. 虛引用又被稱為幽靈引用或者幻影引用。

四. 生存還是死亡

1. 即使在可達(dá)性分析中不可達(dá)的對象,也并非是非死不可,只是處于緩刑階段,要真正死亡至少要經(jīng)歷兩次標(biāo)記,這跟finalize有關(guān)。

2. finalize函數(shù)比較危險(xiǎn),盡量不用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容