一、GC日志简介
1.1 什么是GC日志
GC日志是JVM在运行过程中,自动记录的每一次垃圾回收行为日志,完整记录GC触发时间、GC类型、内存占用变化、各阶段耗时、堆分区状态、停顿时长等核心指标,是JVM垃圾回收的「黑匣子」。
它区别于业务日志、系统日志,只专注记录内存垃圾回收相关行为,不掺杂业务信息,精准反映JVM内存运行健康度。
1.2 GC日志的核心价值
-
故障溯源:精准定位频繁YoungGC、FullGC、GC卡顿、内存泄漏的触发根源;
-
性能评估:统计GC吞吐量、停顿时间、GC频率,判断JVM参数是否合理;
-
优化验证:参数调整前后对比GC日志,量化优化效果;
-
长期监控:留存历史数据,规避线上突发GC故障无现场的问题。
1.3 GC日志分类
根据垃圾回收类型,日志主要分为两类:
-
Young GC(Minor GC)日志:新生代Eden区满触发,频率高、耗时短、正常业务常态;
-
Full GC/Major GC日志:老年代、元空间不足或主动触发,耗时久、STW停顿长,是系统卡顿的核心元凶。
二、如何分析GC日志(生产核心)
2.1 如何打印GC日志(JDK8及主流版本)
JDK8及以下使用传统GC日志参数,生产推荐全套完整打印参数,兼顾日志完整性与可读性,可直接上线配置。
2.1.1 生产标准GC日志打印参数(可直接复用)
# 完整GC日志生产配置参数
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCApplicationConcurrentTime
-Xloggc:/data/logs/jvm/gc-%t.log
-XX:GCLogFileSize=100M
-XX:NumberOfGCLogFiles=10
-XX:+UseGCLogFileRotation
2.1.2 核心参数逐一详解
-
-XX:+PrintGCDetails:打印GC详细日志,包含新生代、老年代、元空间内存变化、各阶段耗时,是分析日志的基础参数;
-
-XX:+PrintGCDateStamps:打印绝对时间戳(年月日时分秒),精准匹配业务故障时间点,生产必加;
-
-XX:+PrintGCTimeStamps:打印服务启动相对时间,用于统计GC触发频率;
-
-XX:+PrintGCApplicationStoppedTime:打印GC导致的STW停顿总时间,直接反映系统卡顿时长;
-
-XX:+PrintGCApplicationConcurrentTime:打印两次GC之间业务正常运行时间,判断GC密集度;
-
-Xloggc:指定GC日志输出路径与文件名,%t 自动拼接时间戳,避免日志覆盖;
-
-XX:GCLogFileSize:单个GC日志文件最大大小,防止单文件过大;
-
-XX:NumberOfGCLogFiles:GC日志文件滚动保留数量,避免磁盘打满;
-
-XX:+UseGCLogFileRotation:开启GC日志滚动切割,生产必备。
2.1.3 JDK9+ 统一日志格式(新规范)
JDK9及以上废弃传统打印参数,统一使用 -Xlog 整合日志配置,更简洁规范:
# JDK9+ 极简GC日志配置
-Xlog:gc*:file=/data/logs/jvm/gc-%t.log:time,uptime,level,tags:filecount=10,filesize=100M
2.2 日志基础字段通用解析
无论CMS/G1,GC日志核心字段通用,掌握即可快速读懂基础日志:
-
GC类型:GC(Minor GC)、Full GC、CMS、G1 GC;
-
内存变化:GC前内存占用 -> GC后内存占用(总堆内存);
-
耗时字段:user用户耗时、sys系统耗时、real实际STW耗时;
-
时间戳:精准定位故障发生时间;
-
停顿时间:应用暂停时长,判断是否影响业务。
2.3 CMS 与 G1 日志打印核心差异
CMS和G1的GC日志结构完全不同,核心差异源于回收机制、分代模型、执行阶段不同,是日志分析的核心难点。
2.3.1 CMS GC日志特征与阶段标识
CMS是老年代并发回收收集器,日志会清晰打印六大执行阶段,存在明显的阶段特征关键字:
-
CMS-initial-mark:初始标记阶段,短暂STW,标记根对象;
-
CMS-concurrent-mark:并发标记,业务线程并行执行,无STW;
-
CMS-concurrent-preclean:并发预清理,修正并发期间引用变动;
-
CMS-remark:重新标记,短暂STW,最终修正漏标对象;
-
CMS-concurrent-sweep:并发清除,回收垃圾内存;
-
CMS-concurrent-reset:并发重置,等待下一轮GC;
CMS日志特点:阶段拆分细、存在多次短暂STW、会打印Concurrent Mode Failure降级FullGC日志、存在内存碎片回收记录。
2.3.2 G1 GC日志特征与阶段标识
G1是分区式增量回收,日志不再严格区分新生代、老年代,核心标识为 G1 Evacuation Pause(年轻代GC) 、G1 Mixed Pause(混合GC),无CMS阶段关键字。
G1日志特点:
-
以Region分区为单位统计内存,不单独打印Eden/Survivor完整分区数据;
-
区分年轻代GC、混合GC、FullGC三种场景;
-
可精准查看每轮GC回收的分区数量、内存释放大小、停顿耗时;
-
日志侧重可控停顿时间,打印目标停顿时间与实际耗时对比。
2.3.3 核心差异汇总表
| 对比维度 | CMS GC日志 | G1 GC日志 |
|---|---|---|
| 核心标识 | CMS多阶段关键字(initial-mark、remark等) | G1 Evacuation、G1 Mixed |
| 内存统计维度 | 严格分新生代、老年代、元空间 | 基于Region分区统计,弱化分代 |
| STW特征 | 两次关键STW(初始标记、重新标记) | 单次集中STW,增量可控停顿 |
| 异常日志 | Concurrent Mode Failure、promotion failed | G1 Full GC、Region分配失败 |
| 日志侧重点 | 并发阶段耗时、内存碎片、降级记录 | 停顿时间达标率、分区回收效率 |
2.4 GC日志手动分析核心思路
-
看频率:统计YoungGC、FullGC每小时触发次数,判断是否频繁GC;
-
看耗时:重点关注FullGC单次耗时、STW停顿时间,判断卡顿影响;
-
看内存变化:GC后内存是否能正常释放,判断是否存在内存泄漏;
-
看异常关键字:检索promotion failed、Concurrent Mode Failure、Full GC频繁触发标识;
-
看晋升情况:YoungGC后大量对象晋升老年代,预判老年代膨胀风险。
三、GC日志分析工具:GCEasy 完整详解
手动分析原始GC日志效率极低、容易遗漏细节,生产主流使用 GCEasy 一键可视化分析,自动识别问题、生成报表、给出优化方案,是JVM调优标配工具。
3.1 GCEasy 工具简介
GCEasy 是业界主流免费在线GC日志智能分析工具,由Tier1app公司开发,支持JDK全版本、CMS/G1/ZGC所有收集器日志格式,兼容Linux/Mac/Windows输出的GC日志。
依托机器学习算法,自动解析GC日志、统计性能指标、定位异常GC、识别内存泄漏、评估JVM参数合理性,并给出可视化报表与优化建议,被上万企业用于生产JVM性能排查。
3.2 核心功能介绍
-
全自动日志解析:上传gc.log原始文件,无需手动配置,自动适配收集器类型;
-
核心指标统计:GC总次数、Young/FullGC占比、平均耗时、最大停顿时间、系统吞吐量;
-
异常智能识别:自动检测频繁GC、长时间STW、内存泄漏、GC降级、对象晋升异常;
-
可视化图表生成:内存变化曲线、GC耗时曲线、GC频率分布图、停顿时间统计;
-
参数优化建议:根据日志运行数据,精准推荐堆内存大小、GC阈值、收集器适配方案;
-
问题分级告警:区分严重问题、警告问题、正常指标,快速聚焦核心故障。
3.3 GCEasy 使用步骤(极简上手)
-
打开GCEasy官方网站;
-
上传服务器导出的原始gc.log日志文件;
-
等待10秒左右自动解析完成;
-
查看整体健康评分、异常告警、可视化报表;
-
根据工具给出的优化建议落地参数调整。
3.4 GCEasy 优点
-
零成本免费使用:核心分析功能完全免费,无需安装、无需部署、开箱即用;
-
分析精准高效:规避人工分析遗漏,毫秒级定位GC异常、内存隐患;
-
全收集器兼容:完美支持CMS、G1、ZGC、Parallel GC等所有主流收集器日志;
-
可视化直观:图表化展示内存波动、GC耗时变化,问题一目了然;
-
落地性强:不只是统计数据,直接给出可落地的JVM调优方案;
-
适配生产复盘:可导出分析报告,用于故障复盘、性能评审。
3.5 GCEasy 缺点与使用限制
-
隐私安全风险:在线上传日志,敏感生产环境、涉密业务不建议使用,存在数据泄露隐患;
-
大文件解析受限:超大GC日志文件解析速度慢,部分超长日志可能解析失败;
-
依赖网络:纯在线工具,内网离线环境无法直接使用;
-
高阶优化有限:基础GC问题精准识别,复杂内存泄漏、极细微性能瓶颈仍需人工结合dump日志分析;
-
无实时监控能力:仅支持离线日志分析,无法实时监控线上GC状态。
3.6 生产使用规范
-
外网非敏感业务:直接使用GCEasy在线快速分析、复盘优化;
-
内网涉密业务:可搭建GCEasy离线版,或采用人工解析+本地日志分析工具;
-
优先以工具告警为基础,结合业务场景人工校验,不盲目照搬优化建议。