JVM学习笔记之三 垃圾回收可达性分析算法

垃圾回收中无用对象的判断

为什么要垃圾回收

    JVM堆内存和方法区,不像程序计数器,虚拟机栈和本地方法栈等运行时区域,随着线程的生死而分配内存和释放内存,不需要主动回收内存。堆中并且存储了绝大多数对象,占用较大的内存空间。当对象越存储越多的时候,以至于不能够为正要创建的对象提供大小合适的内存空间时,就要触发javaGC,也就是java的自动内存回收,通过该行为中系统中“无用的对象”的内存回收后再次利用。

可达性分析算法

    既然GC要回收系统中的垃圾-无用对象,那么就必须知道什么样子的对象算是无用的。java以及其他一些商用语言例如C#,通过可达性分析算法来判断对象是否无用,也就是是否存活。可达性分析算法:通过一系列的成为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则说明此对象不可达,即无用对象。也就是垃圾收集器需要回收的对象。

    可作为GC Roots的对象:

    1.虚拟机栈中栈帧里的本地变量表中引用的对象;

    2.方法区中静态属性引用的对象;

    3.方法区中常量引用的对象;

    4.本地方法栈中JNI(也就是native方法)引用的对象。

    关于引用计数算法

     除了可达性分析算法为还有别的判断对象是否被引用的算法,例如引用计数算法。引用计数算法就是给对象创建一个引用计数器,当给对象添加一个引用是,计数器加1,当给对象消除一个引用时,计数器减1.虽然这种算法可以更简单的计算对象是是否在用,但是它不能解决对象之间循环引用的问题,所以主流的java虚拟机没有选择该算法。

    本例直接引用周志明《深入理解java虚拟机》中的例子:


在eclipse中运行前需要配置下VM参数:

扫描二维码关注公众号,回复: 1558266 查看本文章


运行结果如下:


系统进行了GC,表明系统并未采用引用计数法来计算对象是否无用。

声明:本博客中大量参考引用了周志明作者《深入理解java虚拟机》2版中的第三章节的内容,也可以看作是本书的学习笔记。

猜你喜欢

转载自blog.csdn.net/tony_java_2017/article/details/80642247
今日推荐