java G1垃圾回收日志

境里婆娑 于 2020-04-25 18:52:32 发布

提起看GC日志大部分同学可能都会皱起眉头不知道如何看、什么时候看以及GC日志如何帮助我们调优JVM等。本篇文章将讲解主流垃圾回收器G1,目前Java官方推荐使用G1,所以学看G1垃圾回收日志迫在眉睫。

在学习查看G1 GC日志之前,如果对G1不是很了解,可以看这篇文章,讲的非常详细。

传送门: G1垃圾收集器简介

G1的日志参数分为等级递增的三块,这篇文章将会分别介绍每一部分参数的作用和调优时候使用的场景。

一、如何在idea打印G1日志

在idea中配置启动参数 VM options: -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseG1GC 在这里插入图片描述

二、G1基础参数

如果你要在生产环境中使用G1 GC,下面这些跟日志相关的参数是必备的,有了这些参数,你才能排查基本的垃圾回收问题。

-Xloggc:/path/to/gc.log写入GC日志的路径
-XX:+UseGCLogFileRotation启用GC日志文件轮换
-XX:NumberOfGCLogFiles =要保留的旋转GC日志文件数
-XX:GCLogFileSize =每个GC日志文件的大小以启动轮换
-XX:+ PrintGCDetial详细的GC日志
-XX:+ PrintGCDateStamps每次GC时会打印程序启动后至GC发生的时间戳
-XX:+ PrintGCApplicationStoppedTimeGC期间应用程序停止的时间
-XX:+ PrintGCApplicationConcurrentTime应用程序在GC之间运行的时间
-XX:-PrintCommandLineFlags在GC日志中打印所有命令行标志
-XX:MaxGCPauseMillis=n设置最大GC停顿时间(GC pause time)指标(target). 这是一个软性指标(soft goal), JVM 会尽量去达成这个目标.
XX:InitiatingHeapOccupancyPercent=n启动并发GC周期时的堆内存占用百分比. G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比. 值为 0 则表示"一直执行GC循环". 默认值为 45.
-XX:NewRatio=n新生代与老生代(new/old generation)的大小比例(Ratio). 默认值为 2.
-XX:SurvivorRatio=neden/survivor 空间大小的比例(Ratio). 默认值为 8.
-XX:MaxTenuringThreshold=n提升年老代的最大临界值(tenuring threshold). 默认值为 15.
-XX:G1ReservePercent=n设置堆内存保留为假天花板的总量,以降低提升失败的可能性. 默认值是 10.
-XX:G1HeapRegionSize=n使用G1时Java堆会被分为大小统一的的区(region)。此参数可以指定每个heap区的大小. 默认值将根据 heap size 算出最优解. 最小值为 1Mb, 最大值为 32Mb.

使用-XX:GCLogFileSize设置合适的GC日志文件大小,使用-XX:NumberOfGCLogFiles设置要保留的GC日志文件个数,使用-Xloggc:/path/to/gc.log设置GC日志文件的位置,通过上面三个参数保留应用在运行过程中的GC日志信息,我建议最少保留一个星期的GC日志,这样应用的运行时信息足够多的,方便排查问题。

三、G1新生代收集

和其他垃圾收集器一样,G1也使用-XX:PrintGCDetails打印出详细的垃圾收集日志,下面是新生代收集的标准流程,我在这里将它分成了6个步骤:

1、 四个关键信息
2、 列出了新生代收集中并行收集的详细过程
3、列出了新生代GC中的一些任务:
4、包含一些扩展功能
5、展示了不同代的大小变化,以及堆大小的自适应调整。

Eden:4096.0K(4096.0K)->0.0B(3072.0K):(1)当前新生代收集触发的原因是Eden空间满了,分配了4096K,使用了4096K;(2)所有的Eden分区都被疏散处理了,在新生代结束后Eden分区的使用大小成为了0.0B;(3)Eden分区的大小缩小为3072K Survivors:1024.0K->1024.0K:由于年轻代分区的无回收处理,survivor的空间不变。 Heap: 23.9M(28.0M)->20.4M(28.0M):(1)在本次垃圾收集活动开始的时候,堆空间整体使用量是23.9M,堆空间的最大值是28.0M;(2)在本次垃圾收集结束后,堆空间的使用量是20.4M,最大值保持不变。

6、第6点展示了本次新生代垃圾收集的时间

四、并发垃圾收集

G1的第二种收集活动是并发垃圾收集,并发垃圾收集的触发条件有很多,但是做的工作都相同,它的日志所示:

1、标志着并发垃圾收集阶段的开始
2、表示第并发标记阶段做的第一个事情:根分区扫描
3、表示并发标记阶段
4、重新标记阶段,会Stop the World
5、清理阶段,也会Stop the World
6、并发清理阶段

五、程序发生Full GC

如果堆内存空间不足以分配新的对象,或者是Metasapce空间使用率达到了设定的阈值,那么就会触发Full GC——你在使用G1的时候应该尽量避免这种情况发生,因为G1的Full Gc是单线程、会Stop The World,代价非常高。Full GC的日志如下所示,从中你可以看出三类信息

基础配置参数中,我这里还想介绍两个:-XX:+PrintGCApplicationStoppedTime和-XX:+PrintGCApplicationConcurrentTime,这两个参数也可以为你提供有用的信息,如下所示

1 、记录了应用线程在安全点被暂停的总时间(也就是STW的总时间) 2、 记录了在两个安全点之间应用线程运行的时间

本篇文章参考:Collecting and reading G1 garbage collector logs - part 2