当前位置:   article > 正文

【JVM学习】垃圾回收相关算法

【jvm学习】垃圾回收相关算法

文章更新于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正!

GC 标记-清除算法由标记阶段清除阶段构成。在标记阶段会把所有的活动对象都做上标记,然后在清除阶段会把没有标记的对象(非活动对象)回收。

一、标记阶段:引用计数算法

在垃圾标记阶段,JVM将标记所有活动对象。判断对象存活一般有两种方式:引用计数算法可达性分析算法。

引用计数算法(Reference Counting)比较简单,对每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。

对于一个对象A,只要有任何一个对象引用了A,则A的引用计数器就加1;当引用失效时,引用计数器就减1。只要对象A的引用计数器的值为0,即表示对象A不可能再被使用,可进行回收。

优点:实现简单,垃圾对象便于辨识;判定效率高,回收没有延迟性

缺点:

  • 它需要单独的字段存储计数器,这样的做法增加了存储空间的开销
  • 每次赋值都需要更新计数器,伴随着加法和减法操作,这增加了时间开销
  • 引用计数器有一个严重的问题,即无法处理循环引用的情况。这是一条致命缺陷,导致在Java的垃圾回收器中没有使用这类算法。

循环引用

当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();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

设置参数-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()
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/397658
推荐阅读
相关标签
  

闽ICP备14008679号