JVM学习笔记——垃圾回收篇( 六 )

  • -XX:MaxGCPauseMillis=time设置最大的G1垃圾回收时间
  • G1垃圾回收器阶段简介我们通过一张图来简单介绍G1垃圾回收器的过程:
    JVM学习笔记——垃圾回收篇

    文章插图
    我们可以看到整个流程分为三个阶段:
    • YoungCollection:新生代阶段
    • YoungCollection+ConcurrentMark:新生代阶段+并发标记阶段
    • MixedCollection:混合收集阶段
    Young Collection我们首先给出该阶段的展示图:
    JVM学习笔记——垃圾回收篇

    文章插图
    我们对其进行解释:
    • E就是伊甸园,S就是幸存区,O就是老年代
    • 其产生的正常流程就和分代垃圾回收机制一样,但这阶段不会产生GC
    Young Collection + CM我们首先给出该阶段的展示图:
    JVM学习笔记——垃圾回收篇

    文章插图
    我们对其进行解释:
    • 其字符含义完全相同
    • 当新生代内存占满后进行Young GC时会同时进行GC Root的初始标记
    • 老年代占用堆空间比例达到阈值时,进行并发标记(不会产生STW),阈值可以控制
    我们给出并发标记阈值控制语句:
    // 阈值控制-XX:InitiatingHeapOccupancyPercent=percent (默认45%)Mixed Collection我们首先给出该阶段的展示图:
    JVM学习笔记——垃圾回收篇

    文章插图
    我们对其进行解释:
    • 其字符含义完全相同
    • 但该阶段会对E , S,O进行全面垃圾回收
    • 其中最终标记(Remark)和拷贝存活(Evacation)都会STW(我们均会在后面解释)
    我们需要注意一点:
    • Mixed Collection可能并不会将所有老年代的数据都删除
    • 它会根据你设置的最大暂停时间来进行抉择,如果时间不足以删除所有老年代数据,就会挑选部分较大的内存数据进行回收
    Full GC我们需要重新总结一下Full GC操作:
    1. SerialGC(串行垃圾回收)
    • 新生代内存不足时发生的垃圾收集 - minor gc
    • 老年代内存不足时发生的垃圾收集 - full gc
    1. ParalllelGC(吞吐量优先垃圾回收)
    • 新生代内存不足时发生的垃圾收集 - minor gc
    • 老年代内存不足时发生的垃圾收集 - full gc
    1. CMS(响应时间优先垃圾回收)
    • 新生代内存不足时发生的垃圾收集 - minor gc
    • 老年代内存不足时优先进行标记操作同步垃圾回收,当内存完全占满后才采用full gc
    1. G1(Garbage First)
    • 新生代内存不足时发生的垃圾收集 - minor gc
    • 老年代内存不足时优先进行MixedCollection同步垃圾回收,当内存完全占满后才采用full gc
    G1知识点补充我们在前面已经提到了我们将堆划分为多个Region
    但其实这个Region并不仅仅只分为了E,S,O三个空间,此外还包括以下空间:
    1. RSet(Remember Set :记忆集合)
    /*每一个Region都会划出一部分内存用来储存记录其他Region对当前持有Rset Region中Card的引用针对G1的垃圾回收时间设置较短,在进行标记过程中可能会导致时间过长,所以我们设置了RSet来储存部分信息我们可以直接通过扫描每块Region里面的RSet来分析垃圾比例最高的Region区,放入CSet中,进行回收 。*/
    1. CSet(Collection Set 回收集合)
    /*收集集合代表每次GC暂停时回收的一系列目标分区 。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中 。年轻代收集CSet只容纳年轻代分区,而混合收集会通过启发式算法,在老年代候选回收分区中,筛选出回收收益最高的分区添加到CSet中 。*/新生代跨代引用由于我们的初次标记时会去寻找Root部分
    但其实大部分的Root都放入了老年代,但老年底数据较多难以查找,所以G1提供了一种方法:
    • 将老年代O再次划分为多个区间,名为卡
    • 如果该卡中存储了Root部分,那么就将该卡标记为脏卡,同时放于RSet中存储起来便于查找
    我们给出简单图示:
    JVM学习笔记——垃圾回收篇

    文章插图
    同时如果该Root地址发生变化,G1给出了另外的方法进行更换:
    • 在引用变更时通过post-write barrier + dirty card queue
    • concurrent refinement threads 更新 Remembered Set
    Remark重新标记我们在进行标记时通常采用三色标记法:
    JVM学习笔记——垃圾回收篇

    推荐阅读