GC
作者:互联网
一、引用计数法
给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不能再被使用的。引用计数法实现简单,判定效率也很高,但是它很难解决对象之间相互循环引用的问题。如下代码中 testGC()方法:对象objA和objB都有字段instance,赋值令objA.instance = objB;及objB.instance = objA;除此之外,两个对象再无引用,实际上这两个对象已经不可能再被访问,但是因为它们互相引用着对方,导致它们的引用计数都不为0,于是引用计数器无法通知GC收集器回收它们。
package test; public class ReferenceCountingGC { public Object instance =null; private static final int _1MB=1024*1024; /** * 这个成员属性的唯一意义就是占点内存,以便能在GC日志中看清楚是否被回收过 */ 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; //objA和objB是否能被回收? System.gc(); } }
二、可达性分析算法
通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。
在java语言中,可作为GC Roots的对象包括下面几种:
1、虚拟机栈(栈帧中的本地变量表)中引用的对象;
2、方法区中类静态属性引用的对象;
3、方法区中常量引用的对象;
4、本地方法栈中JNI(即一般所说的Native方法)引用的对象。
标签:对象,objA,instance,objB,GC,引用 来源: https://www.cnblogs.com/xidian2014/p/10468207.html