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對象沒有在任何地方被引用,無法在任何地方通過反射訪問該類的方法。
虛擬機滿足上述三個條件也不一定必然回收,只是可以。