理解 G1 GC 日志
G1 GC 在 java 9 中成为了默认的垃圾回收器,G1 GC 得一大特性就是可以在不降低吞吐量得前提下,指定期望的暂停时间(比如可以设定最大的暂停时间)。
随着 G1 GC 正成为默认的垃圾回收器,它的使用率和可见性将会提高。所以为了正确调整和排查 G1 GC 的相关问题,有必要深入理解 G1 GC 的日志格式。
本文将带领读者了解 G1 GC 日志中的细节。
为了更好的理解,我推荐使用一款 GC 日志分析工具:
环境信息
本文基于 jdk8 的 gc 日志进行解析,jdk9 后启用了新的日志格式,但整体核心内容不变。
jdk : 1.8.0_231
启用 GC 日志
-Xloggc:/home/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps
gc 日志格式解读
当 gc 发生时,gc 格式如下图。
2023-06-24T10:08:36.225+0800: 312307.342 - GC 事件发生的时间 ,其中 312307.342 表示 jvm 启动以来的毫秒数
[GC pause (G1 Evacution Pause)] - Evacuation Pause 代表 存活对象从一个 region(新生代或者新生代+老年代)复制到另外一个 region。
(young) - 表示这是一个 Young GC 事件
[Parallel Time:74.7ms ,GC Workers : 10 ] - 子阶段的流程和耗时,GC Workers: 10 - 代表 GC 线程数
[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 内存.
[Times: user=0.47 sys=0.14, real=0.07 secs] 注意其中的 real 字段,该字段就是本次 gc 的总耗时。
本文是针对 G1 GC 的顶层格式解析,如果想更深入了解 G1 GC 的日志详情,可以使用我们的可视化分析工具来分析: https://moyucoding.com
版权声明: 本文为 InfoQ 作者【你头顶的那片星空】的原创文章。
原文链接:【http://xie.infoq.cn/article/c8ba4fc5a0f18b7f3f6abd8ee】。文章转载请联系作者。
评论