性能调优-------(四)JVM8以上G1算法步骤图解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://xiaochengxinyizhan.blog.csdn.net/article/details/80272799

前提引言:

G1计划作为并发商标扫描收集器(CMS)的长期替代品。将G1与CMS进行比较可以发现G1的差异,这是更好的解决方案。一个区别是G1是一个压缩收集器。此外,G1提供比CMS收集器更多的可预测垃圾收集暂停,并允许用户指定所需的暂停目标。

G1图示解释和G1算法步骤解释

这里写图片描述

来自官方解释:

这里写图片描述
从逻辑上讲,G1是世代的。一组空白区域被指定为合乎逻辑的年轻一代。在图中,年轻一代是淡蓝色。分配工作是由那些合乎逻辑的年轻一代完成的,当年轻一代充满时,这些地区就是垃圾收集(一个年轻的收藏)。在某些情况下,在一组年轻地区之外的地区(深蓝色的旧地区)可以同时进行垃圾收集。这被称为混合收藏。在该图中,收集的区域用红色框标记。该图显示了混合收藏,因为收集了年轻区域和旧区域。垃圾收集是一个压缩集合,它将活动对象复制到选定的初始空白区域。根据幸存对象的年龄,可以将对象复制到幸存者区域(标有“S”)或旧区域(未具体显示)。标有“H”的地区含有大于半数地区的特殊物体,请参见了Humongous对象和分配了Humongous在垃圾-First垃圾收集。

G1 GC模式

G1提供了两种GC模式,Young GC和Mixed GC,两种都是完全Stop The World的。

Young GC:选定所有年轻代里的Region。通过控制年轻代的region个数,即年轻代内存大小,来控制young GC的时间开销。
Mixed GC:选定所有年轻代里的Region,外加根据global concurrent marking统计得出收集收益高的若干老年代Region。在用户指定的开销目标范围内尽可能选择收益高的老年代Region。
由上面的描述可知,Mixed GC不是full GC,它只能回收部分老年代的Region,如果mixed GC实在无法跟上程序分配内存的速度,导致老年代填满无法继续进行Mixed GC,就会使用serial old GC(full GC)来收集整个GC heap。所以我们可以知道,G1是不提供full GC的。

上文中,多次提到了global concurrent marking,它的执行过程类似CMS,但是不同的是,在G1 GC中,它主要是为Mixed GC提供标记服务的,并不是一次GC过程的一个必须环节。global concurrent marking的执行过程分为四个步骤:

初始标记(initial mark,STW)。它标记了从GC Root开始直接可达的对象。
并发标记(Concurrent Marking)。这个阶段从GC Root开始对heap中的对象标记,标记线程与应用程序线程并行执行,并且收集各个Region的存活对象信息。
最终标记(Remark,STW)。标记那些在并发标记阶段发生变化的对象,将被回收。
清除垃圾(Cleanup)。清除空Region(没有存活对象的),加入到free list。
第一阶段initial mark是共用了Young GC的暂停,这是因为他们可以复用root scan操作,所以可以说global concurrent marking是伴随Young GC而发生的。第四阶段Cleanup只是回收了没有存活对象的Region,所以它并不需要STW。

Young GC发生的时机大家都知道,那什么时候发生Mixed GC呢?其实是由一些参数控制着的,另外也控制着哪些老年代Region会被选入CSet。

G1HeapWastePercent:在global concurrent marking结束之后,我们可以知道old generation region中有多少空间要被回收,在每次YGC之后和再次发生Mixed GC之前,会检查垃圾占比是否达到此参数,只有达到了,下次才会发生Mixed GC。
G1MixedGCLiveThresholdPercent:old generation region中的存活对象的占比,只有在此参数之下,才会被选入CSet。
G1MixedGCCountTarget:一次global concurrent marking之后,最多执行Mixed GC的次数。
G1OldCSetRegionThresholdPercent:一次Mixed GC中能被选入CSet的最多old generation region数量。
除了以上的参数,G1 GC相关的其他主要的参数有:

参数 含义
-XX:G1HeapRegionSize=n 设置Region大小,并非最终值
-XX:MaxGCPauseMillis 设置G1收集过程目标时间,默认值200ms,不是硬性条件
-XX:G1NewSizePercent 新生代最小值,默认值5%
-XX:G1MaxNewSizePercent 新生代最大值,默认值60%
-XX:ParallelGCThreads STW期间,并行GC线程数
-XX:ConcGCThreads=n 并发标记阶段,并行执行的线程数
-XX:InitiatingHeapOccupancyPercent 设置触发标记周期的 Java 堆占用率阈值。默认值是45%。这里的java堆占比指的是non_young_capacity_bytes,包括old+humongous

展开阅读全文

没有更多推荐了,返回首页