對象死亡

1、引用計數(shù)算法

給對象添加一個引用計數(shù)器,每當一個地方引用它時,計數(shù)器就加1,當引用失效時,計數(shù)器就減1,任何時刻計算器為0的對象就是不再被使用的。

優(yōu)點:實現(xiàn)簡單,判定效率高。

缺點:很難解決對象之間相互引用的問題。

2、可達性分析算法

通過一系列的稱為“GC Roots”的對象作為起始點,從這個節(jié)點開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈相連時,則證明此對象是不可用的。

Java中,可作為GC Roots的對象包括:

虛擬機棧(棧中的本地變量表)中引用的對象。

方法區(qū)中類靜態(tài)屬性引用的對象。

方法區(qū)中常量引用的對象。

本地方法棧中JNI(即一般說的Native方法)引用的對象。

3、引用

強引用:只要強引用還存在,垃圾回收器永遠不會回收掉被引用的對象。

軟引用:用來描述一些還有用但非必需的對象。在系統(tǒng)將要發(fā)生內(nèi)存溢出異常之前,將會把這些對象列進回收范圍之中進行二次回收。

弱引用:也是用來描述非必需對象的,被弱引用關(guān)聯(lián)的對象只能生產(chǎn)到下一次垃圾回收之前。當垃圾回收器工作時,無論當前內(nèi)存是否足夠,都會回收掉只被弱引用關(guān)聯(lián)的對象。

虛引用:是最弱的一種引用關(guān)系。一個對象是否有虛引用存在,完全不會對其生存空間構(gòu)成影響,也無法通過一個虛引用來獲得一個對象的實例。為一個對象設(shè)置虛引用關(guān)聯(lián)的唯一目的就是能在這個對象被收集器回收時收到一個系統(tǒng)通知。

4、finalize()

如果對象在進行可達性分析后發(fā)現(xiàn)沒有與GC Roots相連接的引用鏈,那它將會被第一次標記并且進行一次篩選,篩選的條件是此對象是否有必要執(zhí)行finalize()方法。(當對象沒有覆蓋finalize()方法,或finalize()方法已經(jīng)被虛擬機調(diào)用過,虛擬機將這兩種情況視為“沒有必要執(zhí)行”)

5、回收方法區(qū)

回收廢棄常量和無用的類。

無用的類:

該類的所有實例都已經(jīng)被回收,也就是Java堆中不存在該類的任何實例。

加載該類的ClassLoader已經(jīng)被回收。

該類對應的java.lang.Class對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。

虛擬機滿足上述三個條件也不一定必然回收,只是可以。

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

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

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