垃圾回收机制垃圾回收机制
垃圾回收机制垃圾回收机制
判断对象是否存活的方法判断对象是否存活的方法
引用计数法引用计数法
每个对象上都有一个引用计数,对象每被引用一次,引用计数器就+1,对象引用被释放,引用计数器-1,直到对象的引用计数
为0,对象就标识可以回收。但是这个算法有明显的缺陷,对于循环引用的情况下,循环引用的对象就不会被回收。
实例:
public class ReferenceCountingGC{
public Object instance = null;
private static final int _1MB = 1024 * 1024;
private byte[] bigSize = new byte[2 * _1MB];
public static void testGC() {
ReferenceCountingGC objA = new ReferenceCountingGC();
ReferenceCountingGC objB = new ReferenceCountingGC();
objA.instance = objB;
objB.instance = objA;
objA = null;
objB = null;
System.gc();
}
}
//发生嵌套引用,但是在java中,objA和objB的内存可以被回收
可达性分析算法可达性分析算法
基本思路是:通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下探索,搜索所走过的路径称为“引用链”,
当一个对象到GC Roots没有任何引用链相连(用图论的话来说,就是从GC Roots到这个对象不可达)时,则证明此对象是不
可用的。在Java语言中,可作为GC Roots的对象包括下面几种
虚拟机栈(栈帧中的本地变量表)中引用的对象;虚拟机栈(栈帧中的本地变量表)中引用的对象;
方法区中类静态属性引用的对象方法区中类静态属性引用的对象
方法区中常量引用的对象方法区中常量引用的对象
本地方法栈中本地方法栈中JNI(即一般说的(即一般说的Native方法)引用的对象。方法)引用的对象。
引用类型引用类型
强引用强引用