如何查看java进程gc情况

 更新时间:2025年07月02日 09:17:05   作者:alden_ygq  
这篇文章主要介绍了如何查看java进程gc情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 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 区容量(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

关键指标

  • 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

参数说明

  • PrintGCDetails:打印 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 进程 → 点击「Monitor」选项卡。
  • 查看「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
老年代使用率稳定在 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 频繁等性能问题。

总结

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

相关文章

  • Spring项目报错解读与全部报错图文详解

    Spring项目报错解读与全部报错图文详解

    这篇文章主要介绍了Spring项目报错解读与全部报错的相关资料,在Spring框架开发中,org.springframework和org.springframework.security相关报错通常源于依赖冲突、配置错误或类路径缺失,需要的朋友可以参考下
    2026-02-02
  • Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

    Java底层基于二叉搜索树实现集合和映射/集合Set功能详解

    这篇文章主要介绍了Java底层基于二叉搜索树实现集合和映射/集合Set功能,结合实例形式分析了Java使用二叉搜索树实现集合和映射相关操作技巧,需要的朋友可以参考下
    2020-03-03
  • mybatis源码解读之executor包语句处理功能

    mybatis源码解读之executor包语句处理功能

    这篇文章主要介绍了executor包语句处理功能,mybatis中支持三种语句类型,不同语句类型支持的变量符号不同,下文详细内容,需要的小伙伴可以参考一下
    2022-02-02
  • Java+Redis撤销重做功能实现

    Java+Redis撤销重做功能实现

    这篇文章主要介绍了Java+Redis实现撤销重做功能,需要考虑撤销的最大步数,撤销之后穿插着其他操作则不能再重做,所以引入分布式锁Redisson进行加锁处理,防止对图表的操作有并发请求导致处理撤销逻辑混乱,感兴趣的朋友跟随小编一起看看吧
    2023-05-05
  • Java动态数组添加数据的方法与应用示例

    Java动态数组添加数据的方法与应用示例

    这篇文章主要介绍了Java动态数组添加数据的方法,结合实例形式详细分析了Java动态数组的创建、添加、查找、打印等相关操作技巧,需要的朋友可以参考下
    2019-11-11
  • Maven scala和java混合打包方式

    Maven scala和java混合打包方式

    这篇文章主要介绍了Maven scala和java混合打包方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • 解决工具接口调用报错:error:Unsupported Media Type问题

    解决工具接口调用报错:error:Unsupported Media Type问题

    当遇到"UnsupportedMediaType"错误时,意味着HTTP请求的Content-Type与服务器期望的不匹配,比如服务器期待接收JSON格式数据,而发送了纯文本格式,常见的Content-Type类型包括text/html、application/json、multipart/form-data等
    2024-10-10
  • Java AbstractMethodError案例分析详解

    Java AbstractMethodError案例分析详解

    这篇文章主要介绍了Java AbstractMethodError案例分析详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring Boot 缓存注解@Cacheable、@CachePut、@CacheEvict超详细实战

    Spring Boot 缓存注解@Cacheable、@CachePut、@CacheEvict超详

    本文将带你从零开始掌握 Spring Boot中常用的缓存注解,并通过多个实际案例演示其强大功能_cacheevict,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-06-06
  • Java多线程并发开发之DelayQueue使用示例

    Java多线程并发开发之DelayQueue使用示例

    这篇文章主要为大家详细介绍了Java多线程并发开发之DelayQueue使用示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-09-09

最新评论