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