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 \
MyAppJDK 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 |
uptimemillis | JVM 启动以来的毫秒数 | 123456 |
uptime | JVM 启动以来的秒数 | 123.456 |
timemillis | 系统时间的毫秒数 | 1711000000123 |
level | 日志级别 | INFO、DEBUG |
tags | 日志标签 | gc、gc+alloc |
thread | 线程信息 | main、VM 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.0OOM 时生成堆转储
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 8 | JDK 9+ |
|---|---|---|
| 详细 GC 日志 | -XX:+PrintGCDetails | -Xlog:gc* |
| 时间戳 | -XX:+PrintGCDateStamps | :time 装饰器 |
| 输出到文件 | -Xloggc:path | :file=path |
| 原因 | -XX:+PrintGCCause | gc+reason |
| 类加载 | -XX:+TraceClassLoading | class+load |
| 堆转储 | -XX:+HeapDumpOnOutOfMemoryError | 同左 |
学会用 -Xlog 是 JDK 9+ 调优的基本功。
下一节,我们来看 MinorGC/FullGC 日志解析。
