JVM GC总结

来源:互联网 发布:windows pe有什么用 编辑:程序博客网 时间:2024/06/12 23:24

前言

总结了一下jvm gc的各种概念。理解GC的各个概念层次应该是:
判断对象已死–>回收算法–>根据算法实现的垃圾回收器分类, 这样更好理解;

判断对象是否可回收方法

  • 引用计数器

    当前对象如果有引用则+1,取消引用-1,当为0时回收。

  • 可达性分析算法

    通过根”GC Roots“的对象做为起点,往下搜索, 搜索的路径为引用链,没有在引用链上的对象都是可回收对象。

垃圾回收算法

  • 标记-清除算法

    最基础的算法,先标记已死对象,在清除对象,缺点容易产生内存碎片。

  • 标记-整理算法

    基于标记-清楚算法,清除时对内存空间进行整理,在清除。

  • 复制算法

    把内存一分为二,一半用于生产,发生GC时,把还活着的对象复制到另一半内存空间,整体清理掉之前的一半。缺点是把内存缩小了一半。

  • 分代收集算法

    分代收集是把堆分为新生代和老年代,根据不同的分区用不同的算法,新生代使用复制算法,老年代使用标记-整理或者标记-清除算法。

GC回收器分类

  • 新生代

    Serial:最基本的,单线程执行,运行时必须停止所有其他线程。(复制算法)
    ParNew:Serial的多线程版本(并行、复制算法)
    Parrallel Scavenge: 多线程并行的收集器,类似ParNew,不同的是他的关注点是吞吐 量;所谓吞吐量就是CPU用于运行用户代码的时间与CPU总
    消耗时间的比值,即吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间),虚
    拟机总共运行了100分钟,其中垃圾收集花掉1分钟,那吞吐量就是99%。(复制算法)

  • 老年代

    Serial old:Serial的老年代版本(标记-整理算法)
    Parallel old:Parrallel Scavenge老年代版本(标记-整理算法)
    CMS:(Concurrent Mark Sweep)是一种以获取最短回收时间为目标的收集器并且是并发执行的,即系统停顿时间最短。(标记-清除算法)

  • G1收集器

    G1是不在区分单独的新生代老年代的收集器,主要是内存布局的差别;G1把整个java堆分成多个大小相等的独立区域,命名为Region。之所以说G1是最好的收集器,原因是它可避免在整个堆中进行垃圾回收,G1是跟踪各个Region里面的垃圾堆积大小,优先回收价值最大的Region(可回收空间最大)。整体看是(标记-清理算法),局部看是(复制算法)。

参考文献《深入理解java虚拟机 第二版》

原创粉丝点击