Skip to content

GC 日志参数设置

GC 日志的重要性

GC 日志是排查 GC 问题和性能调优的基础数据来源。学会正确配置 GC 日志,是 JVM 调优的第一步。

JDK 8 及之前的参数

基本参数

bash
# 打印 GC 详细信息
java -XX:+PrintGCDetails MyApp

# 打印 GC 时间戳(从 JVM 启动开始的秒数)
java -XX:+PrintGCTimeStamps MyApp

# 打印日期时间戳
java -XX:+PrintGCDateStamps MyApp

# 输出到文件
java -Xloggc:/var/log/gc.log MyApp

常用组合

bash
# JDK 8 最常用配置
java -Xms2g -Xmx2g \
     -XX:+UseG1GC \
     -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -XX:+PrintTenuringDistribution \
     -Xloggc:/var/log/gc.log \
     MyApp

JDK 9+ 统一日志框架(-Xlog)

JDK 9 引入了统一的日志框架,使用 -Xlog 参数配置:

bash
# 语法:
-Xlog[:[selector][:[output][:[decorators][::output-options]]]

# selector:选择要记录哪些日志(标签:级别)
# output:输出位置(stdout/stderr/file:path)
# decorators:装饰器(时间/线程/级别等)
# output-options:额外选项(文件滚动等)

常用配置

bash
# 基本用法
java -Xlog:gc* MyApp

# 等价于 JDK 8 的 -XX:+PrintGCDetails
java -Xlog:gc*:file=gc.log MyApp

# 带时间戳
java -Xlog:gc*:file=gc-%t.log MyApp

# 所有 GC 日志
java -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags MyApp

装饰器说明

装饰器说明示例
time系统时间(HH:mm:ss.SSS)10:00:00.123
uptimemillisJVM 启动以来的毫秒数123456
uptimeJVM 启动以来的秒数123.456
timemillis系统时间的毫秒数1711000000123
level日志级别INFODEBUG
tags日志标签gcgc+alloc
thread线程信息mainVM Thread

GC 日志标签

bash
# 常用标签组合
-Xlog:gc*                    # 所有 GC 相关日志
-Xlog:gc=info                 # GC 日志,info 级别
-Xlog:gc::file=gc.log         # 输出到文件
-Xlog:gc+heap=debug            # GC 和堆详细信息

# 详细配置示例
-Xlog:gc*=info,gc+heap*=debug,gc+age*=trace:file=gc.log:filecount=10,filesize=10M

常用 GC 日志参数速查

MinorGC / FullGC 日志

bash
# JDK 9+
java -Xlog:gc*:file=/var/log/gc.log MyApp

# JDK 8
java -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -Xloggc:/var/log/gc.log \
     MyApp

记录 GC 原因

bash
# JDK 9+
java -Xlog:gc*,gc+reason=info:file=gc.log MyApp

# JDK 8
java -XX:+PrintGCDetails \
     -XX:+PrintGCCause \
     MyApp

记录分配失败

bash
# JDK 9+
java -Xlog:gc+alloc=debug:file=gc.log MyApp

记录引用处理

bash
# JDK 9+
java -Xlog:gc+ref*=debug:file=gc.log MyApp

记录类加载/卸载

bash
# JDK 9+
java -Xlog:class+load=trace,class+unload=trace:file=gc.log MyApp

# JDK 8
java -XX:+TraceClassLoading \
     -XX:+TraceClassUnloading \
     MyApp

记录 OOM

bash
# JDK 9+
java -Xlog:exceptions*=info,error:file=gc.log MyApp

# JDK 8
java -XX:+PrintOOMPActivity MyApp

文件滚动

bash
# JDK 9+
-Xlog:gc*:file=gc.log:filecount=10,filesize=10M
# 最多 10 个文件,每个最大 10MB
# 文件名:gc.log.0, gc.log.1, ...

# 使用 %t 插入时间戳
-Xlog:gc*:file=gc-%t.log:filecount=5,filesize=50M
# 生成:gc-2026-03-22_10-00-00.log.0

OOM 时生成堆转储

bash
# JDK 9+
java -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/heap.hprof \
     MyApp

# JDK 8
java -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/ \
     MyApp

完整配置示例

Web 服务配置

bash
# JDK 9+
java -Xms4g -Xmx4g \
     -XX:+UseG1GC \
     -XX:MaxGCPauseMillis=200 \
     -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=10,filesize=50M \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/heap.hprof \
     MyApp

低延迟服务配置

bash
# JDK 11+
java -Xms16g -Xmx16g \
     -XX:+UseZGC \
     -XX:MaxGCPauseMillis=1 \
     -Xlog:gc*:file=/var/log/gc.log:time,uptime,level,tags:filecount=20,filesize=100M \
     -XX:+HeapDumpOnOutOfMemoryError \
     -XX:HeapDumpPath=/var/log/heap.hprof \
     MyApp

本节小结

GC 日志参数速查:

功能JDK 8JDK 9+
详细 GC 日志-XX:+PrintGCDetails-Xlog:gc*
时间戳-XX:+PrintGCDateStamps:time 装饰器
输出到文件-Xloggc:path:file=path
原因-XX:+PrintGCCausegc+reason
类加载-XX:+TraceClassLoadingclass+load
堆转储-XX:+HeapDumpOnOutOfMemoryError同左

学会用 -Xlog 是 JDK 9+ 调优的基本功。

下一节,我们来看 MinorGC/FullGC 日志解析

基于 VitePress 构建