在Java垃圾回收之前,需要判斷對象是不是已經(jīng)死掉,只有死掉的對象才能被GC回收,那么如何判斷一個對象是不是已經(jīng)死掉了呢?
一. 引用計數(shù)法
1. 給對象添加一個引用計數(shù)器,每當(dāng)有一個對象引用它時+1,當(dāng)引用失效時-1,任何時刻計數(shù)器為0的對象就是不可能再被引用的。
2. 實現(xiàn)簡單,效率很高,但很難解決對象之間循環(huán)引用的問題。
二. 可達(dá)性分析
1. 基本思想:通過一系列稱為GC Roots的對象作為起始點,從這些點向下搜索,搜索所走過的路徑稱為引用鏈,當(dāng)一個對象到GC Roots沒有任何引用鏈相連時,此對象不可達(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ù)比較危險,盡量不用。