java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > 查看java进程gc情况

如何查看java进程gc情况

作者:alden_ygq

这篇文章主要介绍了如何查看java进程gc情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 Java 应用性能调优中,监控垃圾回收(GC)情况是关键环节。

以下是查看 Java 进程 GC 状态的常用方法、工具及最佳实践:

一、命令行工具实时监控

1. jstat(JDK 自带)

功能:实时显示 JVM 内存和 GC 统计信息。

语法

jstat -gc <pid> [间隔时间(ms)] [次数]

常用参数

示例

jstat -gc 12345 1000  # 每 1000ms 输出一次 GC 统计

输出字段含义

S0C:Survivor0 区容量(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.560

关键指标

二、GC 日志分析

1. 启用 GC 日志

在 JVM 启动参数中添加:

java -XX:+PrintGCDetails \
     -XX:+PrintGCDateStamps \
     -XX:+PrintHeapAtGC \
     -Xloggc:/path/to/gc.log \
     -jar your-app.jar

参数说明

2. 手动触发 GC 并查看日志

jcmd <pid> GC.run  # 手动触发 Full GC
tail -f /path/to/gc.log  # 实时查看日志

3. 日志分析工具

GCEasy

上传 GC 日志到 GCEasy,自动生成分析报告,包含:

GCViewer

本地工具,可视化 GC 日志:

java -jar gcviewer-1.36.jar /path/to/gc.log

三、可视化工具监控 GC

1. VisualVM(JDK 自带)

启动方式

jvisualvm  # JDK 8 及以前版本自带

监控步骤

2. Java Mission Control (JMC) + JFR

启动 JFR 记录

jcmd <pid> JFR.start name=GCRecording settings=profile duration=5m filename=gc.jfr

分析 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),查看:

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 导致。

优化建议

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
老年代使用率稳定在 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 频繁等性能问题。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文