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