目录
- 一、命令行工具实时监控
- 1. jstat(JDK 自带)
- 2. jstat 进阶用法
- 二、GC 日志分析
- 1. 启用 GC 日志
- 2. 手动触发 GC 并查看日志
- 3. 日志分析工具
- 三、可视化工具监控 GC
- 1. VisualVM(JDK 自带)
- 2. Java Mission Control (JMC) + JFR
- 四、生产环境低开销监控方案
- 1. Prometheus + Grafana
- 2. Arthas(在线诊断工具)
- 五、GC 问题排查思路
- 1. 高频 Full GC 排查
- 2. 长时间 STW(Stop The World)
- 3. 内存泄漏预警
- 六、GC 性能指标参考
- 七、JVM 参数优化建议
- 总结
在 Java 应用性能调优中,监控垃圾回收(GC)情况是关键环节。
以下是查看 Java 进程 GC 状态的常用方法、工具及最佳实践:
一、命令行工具实时监控
1. jstat(JDK 自带)
功能:实时显示 JVM 内存和 GC 统计信息。
语法:
jstat -gc <pid> [间隔时间(ms)] [次数]
常用参数:
-gc
:显示 GC 相关统计。-gcutil
:显示 GC 利用率(百分比)。
示例:
jstat -gc 12345 1000 # 每 1000ms 输出一次 GC 统计
输出字段含义:
S0C:Survivor0 区http://www.devze.com容量(KB) S1C:Survivor1 区容量 S0U:Survivor0 区已使用 EC:Eden 区容量 EU:Eden 区已使用 OC:老年代容量 OU:老年代已使用 MC:元空间容量 MU:元空间已使用 YGC:年轻代 GC 次数 YGCT:年轻代 GC 总耗时(秒) FGC:Full GC 次数 FGCT:Full GC 总耗时 GCT:GC 总耗时
2. jstat 进阶用法
监控 GC 频率和内存增长趋势:
# 每 5 秒输出一次 GC 利用率,持续监控 jstat -gcutil 12345 5000
输出示例:
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 99.81 93.21 42.35 92.83 89.75 126 0.536 1 0.024 0.5www.devze.com60
关键指标:
E
(Eden 区使用率)接近 100% 时触发 YGC。O
(老年代使用率)持续增长可能导致 FGC。YGC
和FGC
频率过高(如每分钟多次)需警惕性能问题。
二、GC 日志分析
1. 启用 GC 日志
在 JVM 启动参数中添加:
java -XX:+PrintGCDetails \ -XX:+PrintGCDateStamps \ -XX:+PrintHeapAtGC \ -Xloggc:/path/to/gc.log \ -jar your-app.jar
参数说明:
PrintG编程客栈CDetails
:打印 GC 详细信息。PrintGCDateStamps
:添加 GC 发生的时间戳。Xloggc
:指定日志文件路径。
2. 手动触发 GC 并查看日志
jcmd <pid> GC.run # 手动触发 Full GC tail -f /path/to/gc.log # 实时查看日志
3. 日志分析工具
GCEasy:
上传 GC 日志到 GCEasy,自动生成分析报告,包含:
- GC 频率和耗时分布。
- 堆内存使用趋势。
- 推荐的 JVM 参数优化建议。
GCViewer:
本地工具,可视化 GC 日志:
java -jar gcviewer-1.36.jar /path/to/gc.log
三、可视化工具监控 GC
1. VisualVM(JDK 自带)
启动方式:
jvisualvm # JDK 8 及以前版本自带
监控步骤:
- 选择目标 Java 进程 → 点击「Monipythontor」选项卡。
- 查看「Heap」和「Perm Gen」变化趋势。
- 点击「Perform GC」手动触发 GC。
2. Java Mission Control (JMC) + JFR
启动 JFR 记录:
jcmd <pid> JFR.start name=GCRecording settings=profile duration=5m filename=gc.jfr
分析 GC 事件:
- 使用 JMC 打开
.jfr
文件。 - 查看「Garbage Collections」视图,分析 GC 类型、耗时和内存变化。
四、生产环境低开销监控方案
1. Prometheus + Grafana
配置 JMX Exporter:
java -javaagent:/path/to/jmx_prometheus_javaagent.jar=9090:/path/to/config.yaml -jar your-app.jar
Grafana 仪表盘:
导入预定义的 JVM 监控仪表盘(如 ID 14548
),查看:
- 堆内存各区域使用情况。
- GC 频率和耗时趋势。
- 类加载 / 卸载数量。
2. Arthas(在线诊断工具)
查看 GC 统计:
dashboard # 实时查看 JVM 状态,包括 GC 信息
监控特定类的 GC 情况:
monitor -c 5 java.lang.String # 每 5 秒统计 String 对象的 GC 情况
五、GC 问题排查思路
1. 高频 Full GC 排查
检查老年代增长趋势:
jstat -gcoldcapacity <pid> 1000 # 监控老年代容量变化
分析大对象分配:
使用 JFR 记录「Object Allocation in New TLAB」事件,找出频繁创建大对象的代码。
2. 长时间 STW(Stop The World)
检查 GC 类型:
通过 GC 日志确认是否为 cms 或 G1 的 Full GC 导致。
优化建议:
- 增大堆内存(
-Xmx
)。 - 调整垃圾收集器(如使用 G1 或 ZGC)。
3. 内存泄漏预警
对比多次堆转储:
# 间隔 1 小时生成两次堆转储 jmap -dump:format=b,file=heap1.hprof <pid> sleep 3600 jmap -dump:format=b,file=heap2.hprof <pid>
使用 MAT 对比两个堆转储,找出持续增长的对象类型。
六、GC 性能指标参考
指标 | 健康值参考 | 问题表现 |
---|---|---|
YGC 频率 | 几分钟到几十分钟一次 | 每秒多次 |
YGC 耗时 | 通常 < 100ms | 超过 500ms |
FGC 频率 | 几小时到几天一次 | 每小时多次 |
FGC 耗时 | 通常 < 500ms | 超过 1s |
老年代使用率 | 稳js定在 30%-70% | 持续增长接近 100% |
GC 总耗时占比 | < 5% | 超过 10% |
七、JVM 参数优化建议
根据应用特点调整 GC 相关参数:
堆内存分配:
-Xms2g -Xmx2g # 堆内存初始值和最大值一致,避免动态调整
新生代比例:
-XX:NewRatio=2 # 老年代:新生代 = 2:1
垃圾收集器选择
# G1 适合大内存(> 8GB)应用 -XX:+UseG1GC -XX:MaxGCPauseMillis=200 # ZGC 适合极低延迟要求(< 10ms STW) -XX:+UseZGC
通过以上方法,可全面监控 Java 进程的 GC 状态,及时发现并解决内存泄漏、GC 频繁等性能问题。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论