赞
踩
文章更新于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!
GC 标记-清除算法由标记阶段
和清除阶段
构成。在标记阶段会把所有的活动对象都做上标记,然后在清除阶段会把没有标记的对象(非活动
对象)回收。
在垃圾标记阶段,JVM将标记所有活动对象。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。
引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。
对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。
优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性。
缺点:
循环引用
当p的指针断开的时候,内部的引用形成一个循环,这就是循环引用,从而造成内存泄漏。
测试Java中是否采用的是引用计数算法:
public class RefCountGC { // 这个成员属性的唯一作用就是占用一点内存 private byte[] bigSize = new byte[5*1024*1024]; // 引用 Object reference = null; public static void main(String[] args) { RefCountGC obj1 = new RefCountGC(); RefCountGC obj2 = new RefCountGC(); obj1.reference = obj2; obj2.reference = obj1; obj1 = null; obj2 = null; // 显示的执行垃圾收集行为,判断obj1 和 obj2是否被回收? System.gc(); } }
设置参数-XX:+PrintGCDetails
运行结果:
[GC (System.gc()) [PSYoungGen: 15442K->776K(75776K)] 15442K->784K(249344K), 0.0021331 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。