- 引用计数法
public class RefCountGC {//几乎不用,因为无法解决循环引用的问题
public Object instance=null;
private byte[] bigSize=new byte[2*1024*1024];
public static void main(String[] args) {
RefCountGC objA=new RefCountGC();
RefCountGC objB=new RefCountGC();
objA.instance=objB;
objB.instance=objA;
objA=null;
objB=null;
System.gc();
}
}
缺点:计数器算法的一大缺点就是不能解决循环引用的问题;如下图,我们构造了一个列表,我们将最后一个元素的next属性指向第一个元素,即引用第一个元素,从而构成循环引用;这个时候如果我们将列表的头head赋值为null,此时列表的各个元素的计数器都不为0,同时我们也失去了对列表的引用控制,从而导致列表元素不能被回收!
- 复制算法(copying)
年轻代的GC主要是复制算法原理
- 标记清除算法(Mark-Sweep)
优缺点:
- 标记压缩(Mark-Compact)
- 标记清除压缩(Mark-Sweep-Compact)
- 没有最好的算法,只有合适的算法-分代收集算法