java gc日志详解_JVM实战:GC日志解析

1、GC日志采集

在服务器上我们需要配置一些参数才能采集到历史的GC日志信息,这些参数通常在项目启动的时候就需要指定,

如果你项目是jar包,可以按照下面方式指定这些GC参数即可。

下面这些参数意思是把GC日志记录到/opt/app/abc-user/ard-user-gc-%t.log 这个文件里,每个文件大小为20M,一共生成5个文件,超过的话则覆盖。

java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:+PrintHeapAtGC -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=20M -Xloggc:/opt/ard-user-gc-%t.log -jar abg-user-1.0-SNAPSHOT.jar

-Xloggc:/opt/app/ard-user/ard-user-gc-%t.log 设置日志目录和日志名称

-XX:+UseGCLogFileRotation 开启滚动生成日志

-XX:NumberOfGCLogFiles=5 滚动GC日志文件数,默认0,不滚动

-XX:GCLogFileSize=20M GC文件滚动大小,需开启UseGCLogFileRotation

-XX:+PrintGCDetails 开启记录GC日志详细信息(包括GC类型、各个操作使用的时间),并且在程序运行结束打印出JVM的内存占用情况

-XX:+ PrintGCDateStamps 记录系统的GC时间

-XX:+PrintGCCause 产生GC的原因(默认开启)

2、Ps+Po日志解析

ParallelScavenge + Parallel Old日志主要会包括下面几类信息:

1、GC类型: 这里会告诉我们产生的是YGC (YGC 代表新生代的GC只会收集Eden区和Survivor )、 还是Full GC(Full GC是针对于整个堆进行搜集)

2、GC产生的原因:这里一般都会告诉我们是因为什么原因导致产生GC,一般通过这里可以分析出具体是因为哪个区域空间不够了导致的GC。

3、回收的情况:这里主要体现出回收的成果,通过数据告诉我们 回收之前的区域对象占用空间大小、回收之后区域对象占用空间的大小 、当前区域的空间大小、回收使用的时长。

下面是一段ParallelScavenge + Parallel Old 组合的 Full GC 日志信息:

下面我们针对一段Full GC日志来逐一对说明对应的内容所表示的信息进行说明。

3、CMS日志解析

如果老年代采用的CMS收集器,那么JVM默认会选择ParNew作为新生代收集器与CMS配合。所以使用CMS后主要是有两种日志类型,一种是ParNew的新生代收集日志,一种是CMS的老年代收集日志。

新生代GC日志(PaNew)

老年代的GC日志(CMS)

CMS日志和之前PS+PO的日志有很大区别,主要是CMS收集机制与之前的收集器不一样,CMS根据阶段来记录GC日志的,GC日志主要分为6个阶段。

//第一阶段 初始标记,CMS的第一个STW阶段,这个阶段会所有的GC Roots进行标记。

2020-10-20T17:04:45.424+0800: 10.756: [GC (CMS Initial Mark) [1 CMS-initial-mark: 68287K(68288K)] 69551K(99008K), 0.0019516 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

解析:CMS Initial Mark 说明该阶段为初始标记阶段,68287K(68288K)当前老年代空间的用量和总量,69551K(99008K)当前堆空间的用量和总量,0.0019516 secs初始化标记所耗费的时间。

//第二阶段并发标记

2020-10-20T17:04:45.426+0800: 10.758: [CMS-concurrent-mark-start]

2020-10-20T17:04:45.519+0800: 10.850: [CMS-concurrent-mark: 0.092/0.092 secs] [Times: user=0.56 sys=0.01, real=0.09 secs]

解析:CMS-concurrent-mark: 0.092/0.092 secs] 并发标记所所耗费的时间

你可能感兴趣的:(java,gc日志详解)