引用计数法存在的问题(JVM没有采用该方式判断对象是否为垃圾的原因)
如果对象的引用是发生在堆上2个对象之间的相互引用,这样对象即的引用计数器不会为0所以对象不会被回收,看图
file:///C:/Users/Administrator/Desktop/Notes/resources/7E4172C5BC95034CDBCD874666EE7287.jpg
通过代码来验证
public class Demo {
private Object obj = new Object();
public Demo(){
//为了明显的看到回收器收集了垃圾
//定义一个比较大的字节数组,占用大
//的内存空间,调用gc()之后会释放
byte[] bytes = byte[30*1024*1024];
}
public static void main(String[] args) {
Demo d1 = new Demo();
Demo d2 = new Demo();
d1.obj = d2.obj;
d2.obj = d1.obj;
d1 = null;
d2 = null;
System.gc();
}
}
通过idea工具来查看GC输出日志文件
配置VM的GC输出参数,如果不配置不会在控制台输出GC日志信息
file:///C:/Users/Administrator/Desktop/Notes/resources/BEBDAA0AD914B9C4A75040289EB77899.jpg
idea运行代码控制台输出的日志信息
file:///C:/Users/Administrator/Desktop/Notes/resources/EB7163212052AFF3D3B1AC864CA99B80.jpg
通过日志文件可以看出JVM任然回收了垃圾,这就说明JVM虚拟机并没有采用引用计数法这种方式