开发者

如何查看java进程gc情况

开发者 https://www.devze.com 2025-07-02 10:31 出处:网络 作者: alden_ygq
目录一、命令行工具实时监控1. jstat(JDK 自带)2. jstat 进阶用法二、GC 日志分析1. 启用 GC 日志2. 手动触发 GC 并查看日志3. 日志分析工具三、可视化工具监控 GC1. VisualVM(JDK 自带)2. Java Mission Control
目录
  • 一、命令行工具实时监控
    • 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)。

        0

        精彩评论

        暂无评论...
        验证码 换一张
        取 消

        关注公众号