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