日志分析工具(GCEasy/GCViewer)
GC 日志分析工具
GC 日志文件通常很大(几百 MB 到几个 GB),人工阅读几乎不可能。GC 日志分析工具把数据可视化,帮助你快速定位问题。
GCEasy:在线 GC 日志分析
简介
GCEasy 是最流行的在线 GC 日志分析工具,支持上传 GC 日志,自动分析并生成可视化报告。
功能特点
| 功能 | 说明 |
|---|---|
| 自动解析 | 支持所有主流 GC 收集器的日志格式 |
| 可视化图表 | GC 停顿时间、吞吐量、内存趋势 |
| 问题检测 | 自动识别 GC 问题(频繁 FullGC、停顿过长) |
| 建议优化 | 基于分析结果给出调优建议 |
| 对比功能 | 对比多次运行的结果 |
使用步骤
1. 打开 https://gceasy.io/
2. 上传 GC 日志文件(.log 或 .txt)
3. 等待分析完成(通常几秒到几分钟)
4. 查看分析报告关键指标解读
GCEasy 报告包含以下核心指标:
GC 吞吐量:93.5%
↑ 93.5% 的时间用于运行程序,6.5% 用于 GC
↑ 推荐:> 95%
平均 GC 停顿时间:45ms
↑ 平均每次 GC 停顿时间
最大 GC 停顿时间:320ms
↑ 最长一次 GC 停顿
GC 停顿占总时间:6.5%
↑ 推荐:< 5%典型问题识别
问题一:FullGC 频繁
指标表现:
- Full GC 频率:每天 50 次
- Full GC 原因:老年代使用率持续在 90%+
建议:增大堆、使用 G1、检查内存泄漏
问题二:GC 停顿过长
指标表现:
- 最大停顿:5.8 秒
- 使用的收集器:Serial GC
建议:切换到 G1 或 ZGC
问题三:MinorGC 过于频繁
指标表现:
- MinorGC 频率:每分钟 50 次
- 年轻代使用率:每次 MinorGC 后迅速回到 90%+
建议:增大年轻代、减少对象分配GCViewer:离线开源工具
简介
GCViewer(也叫 GCViewer)是 SourceForge 上的开源工具,用于本地分析 GC 日志。
下载地址:https://github.com/chewiebug/GCViewer
功能特点
| 功能 | 说明 |
|---|---|
| 本地分析 | 无需上传,保护数据隐私 |
| 完全免费 | 开源 MIT 许可 |
| 图表丰富 | GC 次数、时间、内存趋势图 |
| 数据导出 | CSV 导出,方便进一步分析 |
| 命令行支持 | 适合自动化集成 |
使用步骤
bash
# 1. 下载 GCViewer JAR 文件
wget https://github.com/chewiebug/GCViewer/releases/download/1.34.1/gcviewer-1.34.1.jar
# 2. 运行(需要 Java 8+)
java -jar gcviewer-1.34.1.jar
# 3. 或命令行使用
java -jar gcviewer-1.34.1.jar \
gc.log \ # 输入日志文件
output.png # 输出图表文件
-t SUMMARY # 只输出摘要关键图表
GCViewer 生成多种图表:
| 图表 | 说明 |
|---|---|
| GC 时长 vs 时间 | 显示 GC 停顿时间随时间的变化趋势 |
| 内存使用 vs 时间 | 显示堆内存随时间的变化 |
| GC 次数 vs 时间 | 显示 GC 频率随时间的变化 |
| 吞吐量 vs 时间 | 显示应用吞吐量随时间的变化 |
关键指标
Throughput: 94.3%
↑ GC 吞吐量,值越高越好
Avg Pause: 45ms
↑ 平均停顿时间
Max Pause: 320ms
↑ 最大停顿时间
Total Pause Time: 5.6min
↑ 总停顿时间
Minor GC Count: 500
↑ MinorGC 次数
Full GC Count: 3
↑ FullGC 次数
Promotion: 200MB
↑ 晋升到老年代的内存量jstat:命令行实时监控
基本用法
bash
# 查看 GC 统计(每 1 秒刷新一次)
jstat -gcutil <pid> 1000
# 输出:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.00 65.21 78.33 92.00 88.00 123 2.34 5 12.34 14.68各列含义
| 列 | 含义 |
|---|---|
| S0 | Survivor 0 使用率 |
| S1 | Survivor 1 使用率 |
| E | Eden 使用率 |
| O | 老年代使用率 |
| M | 元空间使用率 |
| YGC | 年轻代 GC 次数 |
| YGCT | 年轻代 GC 总时间(秒) |
| FGC | FullGC 次数 |
| FGCT | FullGC 总时间(秒) |
| GCT | GC 总时间 |
监控命令组合
bash
# 监控 GC 趋势(每 10 秒输出一次)
watch -n 10 'jstat -gcutil <pid>'
# 查看堆使用(-gccapacity)
jstat -gccapacity <pid>
# 输出:
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
102400.0 102400.0 102400.0 10240.0 10240.0 81920.0 1884160.0 1884160.0 1884160.0 0.0 1085440.0 107929.6 0.0 1048576.0 106496.0 0 5MAT:堆转储分析
当 GC 日志无法定位问题时,需要分析堆转储:
bash
# 生成堆转储(JDK 9+)
jcmd <pid> GC.heap_dump /tmp/heap.hprof
# JDK 8
jmap -dump:format=b,file=/tmp/heap.hprof <pid>然后用 Eclipse MAT 或 JProfiler 分析 dump 文件:
| 工具 | 说明 |
|---|---|
| Eclipse MAT | 免费,功能强大,推荐 |
| JProfiler | 商业软件,功能全面 |
| VisualVM | JDK 内置,够用 |
| async-profiler | 开源,CPU 和内存分析 |
工具选择建议
| 场景 | 推荐工具 |
|---|---|
| 快速在线分析 | GCEasy |
| 离线分析,保护隐私 | GCViewer |
| 实时监控 | jstat / jconsole / VisualVM |
| 深度堆分析 | Eclipse MAT |
| 生产环境诊断 | Arthas + GCViewer |
本节小结
GC 日志分析工具速查:
| 工具 | 类型 | 适用场景 |
|---|---|---|
| GCEasy | 在线 | 快速分析,推荐首选 |
| GCViewer | 离线开源 | 本地分析,数据隐私 |
| jstat | 命令行 | 实时监控 |
| jconsole | 图形界面 | 实时监控 + JMX |
| VisualVM | JDK 内置 | 综合分析 |
| Eclipse MAT | 堆 dump 分析 | 内存泄漏定位 |
| Arthas | 命令行 | 线上诊断 |
GC 调优的正确流程是:GC 日志分析 → 发现问题 → 针对性调优 → 验证效果 → 重复。
到这里,「GC 日志分析」部分全部完成,「垃圾回收(GC)核心」全部完成。
