1、引用計數(shù)算法
給對象添加一個引用計數(shù)器,當(dāng)對象增加一個引用時計數(shù)器加 1,引用失效時計數(shù)器減 1。引用計數(shù)為 0 的對象可被回收。
兩個對象出現(xiàn)循環(huán)引用的情況下,此時引用計數(shù)器永遠不為 0,導(dǎo)致無法對它們進行回收。
正因為循環(huán)引用的存在,因此 Java 虛擬機不使用引用計數(shù)算法。
2、可達性分析算法
通過 GC Roots 作為起始點進行搜索,能夠到達到的對象都是存活的,不可達的對象可被回收。
Java 虛擬機使用該算法來判斷對象是否可被回收,在 Java 中 GC Roots 一般包含以下內(nèi)容:
虛擬機棧中引用的對象本地方法棧中引用的對象方法區(qū)中類靜態(tài)屬性引用的對象方法區(qū)中的常量引用的對象。