25 June 2023

G1 GC在java 9 中成为了默认的垃圾回收器,G1 GC得一大特性就是可以在不降低吞吐量得前提下,指定期望的暂停时间(比如可以设定最大的暂停时间)。

随着G1 GC 正成为默认的垃圾回收器,它的使用率和可见性将会提高。所以为了正确调整和排查G1 GC的相关问题,有必要深入理解G1 GC的日志格式。

本文将带领读者了解G1 GC日志中的细节。

为了更好的理解,我推荐使用一款GC日志分析工具:

https://moyucoding.com

环境信息

本文基于jdk8的gc日志进行解析,jdk9 后启用了新的日志格式,但整体核心内容不变。

jdk : 1.8.0_231

启用GC日志

-Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps

gc 日志格式解读

当gc发生时,gc格式如下图。

image

  1. 2023-06-24T10:08:36.225+0800: 312307.342 - GC事件发生的时间 ,其中312307.342表示jvm启动以来的毫秒数
  2. [GC pause (G1 Evacution Pause)] - Evacuation Pause 代表 存活对象从一个region(新生代或者新生代+老年代)复制到另外一个region。
  3. (young) - 表示这是一个 Young GC 事件
  4. [Parallel Time:74.7ms ,GC Workers : 10 ] - 子阶段的流程和耗时,GC Workers: 10 - 代表GC线程数
  5. [Eden: 3518.0M(3518.0M)->0.0B(3588.0M) Survivors: 168.0M->98.0M Heap: 4963.7M(6144.0M)->1448.1M(6144.0M)] - 这一部分代表heap的变化: 6.1 Eden: 3518.0M(3518.0M)->0.0B(3588.0M) - 表示Eden代的容量为3518mb,并且3518mb全部被占用。 这次GC事件之后,年轻代占用的大小增大为3588M。Eden代的目标容量已增加到3588mb。 6.2 Survivors: 168.0M->98.0M - 表示在此 GC 事件之前 Survivor 空间为168M 。 但在GC后Survivor大小减小到98M。 6.3 Heap: 4963.7M(6144.0M)->1448.1M(6144.0M) - 堆容量不变,但使用的内存从4963.7M 降低为1448.1M,回收了3515M内存.
  6. [Times: user=0.47 sys=0.14, real=0.07 secs] 注意其中的real字段,该字段就是本次gc的总耗时。

本文是针对G1 GC的顶层格式解析,如果想更深入了解G1 GC 的日志详情,可以使用我们的可视化分析工具来分析: https://moyucoding.com