美文网首页JVM技术
图解JVM垃圾回收

图解JVM垃圾回收

作者: 那些年搬过的砖 | 来源:发表于2019-06-26 17:52 被阅读0次

    一、垃圾收集器所属分代总览

    1、各代采用的收集器

    有连线的表示可搭配使用


    HotSpot虚拟机各代对应的垃圾收集器

    2、垃圾回收算法

    2.1、标记-清除过程

    第一阶段:标记出可回收对象
    第二阶段:回收被标记的对象
    缺点:产生大量的内存碎片

    2.2、复制回收过程

    内存被分为相等的两块(S0+S1),S0为使用内存,S1为保留内存,回收时将S0的存活对象一次性全部复制到S1,再一次性清空S0内存
    缺点:内存使用率只有50%

    2.3、标记整理过程

    第一阶段:标记出存活对象
    第二阶段:存活对象往一端移动,清理边界外内存

    3、各收集器采用的收集算法

    业界商用的JVM收集算法都是采用分代收集,按不同代的特点采用不同的收集算法。
    通常情况,年轻代采用复制算法,年老代采用标记-整理或标记-清除算法。


    G1整体上看基于 "标记-整理" 算法,而两个Region之间则基于 "复制" 算法

    二、各垃圾收集器详解

    1、Serial 和Serial Old组合收集

    单线程串行收集器,垃圾收集时会“Stop The World”


    Serial 和Serial Old组合收集示意图

    2、ParNew 和Serial Old组合收集

    ParNew收集器就是Serial收集器的多线程版本,收集算法和回收策略和Serial完全一样,也会Stop The World。
    注意:ParNew是并行收集器,不是并发收集器

    ParNew 和Serial Old组合收集示意图

    3、Parallel Scavenge收集器

    跟ParNew类似,是一种吞吐量优先收集器,即目标是达到一个可控制的吞吐量

    吞吐量 = 运行用户代码时间 / (运行用户代码时间) + 垃圾收集时间
    

    4、Parallel Scavenge和Parallel Old组合收集

    Parallel Old是Parallel Scavenge收集器的老年代版本


    Parallel Scavenge和Parallel Old组合收集示意图

    5、CMS收集器

    CMS收集器是一种并发收集器,目标时已达到最小回收停顿时间,采用标记清除算法。


    CMS收集器示意图

    6、G1收集器

    G1内存布局中,保留了年轻代年老代的概念,但不是物理隔离,而是很多个大小相同的独立区域(Region),年轻代和年老代都是一部分Region(不需要连续)的集合
    初始标记:标记GC Roots能直接关联到的对象
    并发标记:从GC Roots中对堆对象进行可达性分析,找出存活对象
    最终标记:修改并发期间变动的标记记录
    筛选回收:根据用户指定的停顿时间制定回收计划


    G1收集器示意图
    G1内存布局示意图

    三、存活对象的判断

    不管是采用什么样的垃圾回收算法,都需要判断对象的存活状态,通常会采用两种方式判断

    1、引用计数法

    对象中增加一个引用计数器,每当有地方引用该对象时,其计数器+1,引用失效后计数器-1,当计数器为0的对象,即认为是可回收的对象,但是这种方式无法解决循环引用的问题,所以目前主流的垃圾回收器都没有采用这种方式。

    2、可达性分析算法

    通过GC Roots集合中的对象开始搜索,当某对象不能通过GCRoots到达时,判定为对象可回收。
    对象1、2、3、4不可回收,对象5、6、7可回收

    GCRoots.png

    附一张之前画过的JVM内存模型


    内存模型.jpeg

    相关文章

      网友评论

        本文标题:图解JVM垃圾回收

        本文链接:https://www.haomeiwen.com/subject/bifhcctx.html