You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java 11 G1 GC日志字节详情缺失及输出解读求助

G1 GC日志解读与参数调整指南

现有环境与日志现状

我使用Adoptium Temurin Java 11,配置的G1 GC参数如下:

-XX:+UseG1GC -XX:+DisableExplicitGC -verbosegc -Xlog:gc*,safepoint=debug:file=${GCFILENAME}:tags,time,uptime,level:filecount=10,filesize=10M -XX:-OmitStackTraceInFastThrow -XX:+PrintClassHistogram

得到的日志片段(省略行首时间戳):

[info ][safepoint     ] Entering safepoint region: G1CollectForAllocation
[info ][gc,start      ] GC(5342) Pause Young (Prepare Mixed) (G1 Evacuation Pause)
[info ][gc,task       ] GC(5342) Using 4 workers of 4 for evacuation
[info ][gc,phases     ] GC(5342)   Pre Evacuate Collection Set: 0.1ms
[info ][gc,phases     ] GC(5342)   Evacuate Collection Set: 94.8ms
[info ][gc,phases     ] GC(5342)   Post Evacuate Collection Set: 48.9ms
[info ][gc,phases     ] GC(5342)   Other: 2.7ms
[info ][gc,heap       ] GC(5342) Eden regions: 1521->0(50)
[info ][gc,heap       ] GC(5342) Survivor regions: 15->78(192)
[info ][gc,heap       ] GC(5342) Old regions: 442->442
[info ][gc,heap       ] GC(5342) Humongous regions: 214->0
[info ][gc,metaspace  ] GC(5342) Metaspace: 80251K(87856K)->80251K(87856K) NonClass: 72293K(77488K)->72293K(77488K) Class: 7957K(10368K)->7957K(10368K)
[info ][gc            ] GC(5342) Pause Young (Prepare Mixed) (G1 Evacuation Pause) 4382M->1040M(5120M) 146.102ms
[info ][gc,cpu        ] GC(5342) User=0.56s Sys=0.01s Real=0.15s
[info ][safepoint     ] Leaving safepoint region

当前日志存在大量冗余的安全点输出,例如:

[info ][safepoint     ] Entering safepoint region: Cleanup
[info ][safepoint     ] Leaving safepoint region
[info ][safepoint     ] Total time for which application th
[debug][safepoint     ] Safepoint synchronization initiated
[info ][safepoint     ] Application time: 1.0001197 seconds

核心需求

  1. 解读现有日志格式,比如Eden regions: 1521->0(50)的具体含义,尤其是字节层面的使用与回收量;
  2. 调整日志参数,获取更多已使用、已提交、保留字节数的细节,输出风格接近Java 8的GC日志(同时保留时间戳),避免trace级别的冗余信息。

解答

一、现有G1日志行解读

以Eden regions: 1521->0(50)为例:

  • 1521:GC开始时Eden区占用的区域数量
  • 0:GC结束后Eden区剩余的区域数量(全部被回收)
  • (50):当前Eden区的最大可用区域数量

要换算成字节,需先获取G1的区域大小(Region Size),可通过-XX:PrintFlagsFinal参数查看G1HeapRegionSize的值,默认根据堆大小自动计算(范围1MB~32MB)。比如区域大小为2MB时,1521个区域对应1521*2=3042MB。

其他关键行解读:

  • Survivor regions:15->78(192):GC前Survivor区占用15个区域,GC后占用78个,Survivor区最大可用192个区域;
  • GC(5342) Pause Young (Prepare Mixed) (G1 Evacuation Pause) 4382M->1040M(5120M) 146.102ms:GC前堆总占用4382MB,GC后剩余1040MB,堆总容量5120MB,GC耗时146.102ms。

二、调整GC参数获取字节级细节

要得到类似Java 8的GC日志风格,同时保留时间戳,可调整Xlog参数,减少冗余的安全点debug输出,增加字节层面的堆细节:

推荐参数配置:

-XX:+UseG1GC 
-XX:+DisableExplicitGC 
-Xlog:gc*,gc+heap=debug,safepoint=info:file=${GCFILENAME}:tags,time,uptime,level:filecount=10,filesize=10M 
-XX:-OmitStackTraceInFastThrow 
-XX:+PrintClassHistogram 
-XX:+PrintHeapAtGC

参数说明:

  • gc+heap=debug:启用堆相关的debug级日志,输出每个区域的字节使用情况;
  • safepoint=info:降低安全点日志级别,减少冗余的debug信息;
  • XX:+PrintHeapAtGC:强制在GC前后打印堆的详细结构,包括各代的已用、已提交、保留字节数,风格接近Java 8的PrintGCDetails。

若需要更简洁的字节统计,也可保留-Xlog:gc*,gc+heap=info,同时添加-XX:+PrintGCDetails(Java 11仍支持该参数,会补充传统格式的堆细节)。

三、官方参考依据

Java 11的G1 GC日志格式与参数说明可参考JDK官方文档中垃圾收集日志相关章节,核心内容包括:

  • Xlog参数的标签、级别、输出格式配置规则;
  • G1 GC各阶段日志的具体含义;
  • 区域大小、堆结构相关的参数定义。

内容的提问来源于stack exchange,提问作者Jay Turner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 16:25:06