版权声明: https://blog.csdn.net/jiangxuexuanshuang/article/details/88382490
1、引用计数法
算法:每当有一个地方引用对象时,则计数器加1。引用失效时,计数器减1。计数器为0的对象不可能再被引用。
问题:无法解决循环引用时的引用问题。如:
public class ObjectTest {
public ObjectTest instance = null;
public static void main(String[] args) {
ObjectTest objectA = new ObjectTest();
ObjectTest objectB = new ObjectTest();
objectA.instance = objectB;
objectB.instance = objectA;
objectA = null;
objectB = null;
}
}
2、可达性分析算法
算法:有一系列的GC Root节点,从这些root节点出发,如果都没有关联到该对象,则改对象标记为不可达。
Java中可用作GCRoot的节点有:
a、虚拟机栈中引用的对象
b、方法区中类静态属性引用的对象
c、方法区中常量引用的对象
d、本地方法栈中引用的对象。
3、对象的回收步骤
a、第一次筛选:对象被标记为不可达
b、第二次筛选:是否需要执行finalize,如果需要执行则移入执行队列中等待执行。当执行finalize时如果对象被重新引用,则移除不可达的标记。如果没有重新引用则将大概率被回收。