如何查看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 Boot中日志管理与异常处理实践指南

    Spring Boot中日志管理与异常处理实践指南

    本文系统化讲解SpringBoot日志管理与异常处理,涵盖Logback配置、分层异常处理、上下文记录及ELK集成,强调日志分级、自定义异常设计,增强应用稳定性与可维护性,感兴趣的朋友跟随小编一起看看吧
    2025-06-06
  • springboot乱码问题解决方案

    springboot乱码问题解决方案

    这篇文章主要介绍了springboot乱码问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Kotlin与Java的主客观对比分析

    Kotlin与Java的主客观对比分析

    这篇文章主要介绍了Kotlin与Java的主客观对比分析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • elasticsearch索引创建create index集群matedata更新

    elasticsearch索引创建create index集群matedata更新

    这篇文章主要介绍了elasticsearch索引创建create index及集群matedata更新,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Java 1.0和Java 1.1 的IO类的比较

    Java 1.0和Java 1.1 的IO类的比较

    Java库的IO分为输入/输出两部分。早期的Java 1.0版本的输入系统是InputStream及其子类,输出系统是OutputStream及其子类。后来的Java 1.1版本对IO系统进行了重新设计。本分对此做了分析和比较,有利于学习,最后给出了例子。
    2013-11-11
  • Java 项目中使用递归的小结

    Java 项目中使用递归的小结

    在 Java 中,递归是指在方法的定义中调用自身的过程,递归是基于方法调用栈的原理实现的:当一个方法被调用时,会在调用栈中创建一个对应的栈帧,包含方法的参数、局部变量和返回地址等信息,这篇文章主要介绍了Java 项目中对使用递归的理解分享,需要的朋友可以参考下
    2024-07-07
  • Java14发布了,再也不怕NullPointerException了

    Java14发布了,再也不怕NullPointerException了

    这篇文章主要介绍了Java14发布了,再也不怕NullPointerException了,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-03-03
  • MyBatis-Plus数据库配置与数据源整合方案

    MyBatis-Plus数据库配置与数据源整合方案

    本文详细介绍了在MyBatis-Plus中进行数据库配置与数据源整合的常见方法,包括单数据源和多数据源的配置步骤,以及如何使用SpringBoot的自动配置和手动配置来管理数据源,通过合理的配置,开发者可以简化数据库操作,实现高效的数据库管理和复杂的应用架构
    2025-02-02
  • 详解如何为SpringBoot Web应用的日志方便追踪

    详解如何为SpringBoot Web应用的日志方便追踪

    在Web应用程序领域,有效的请求监控和可追溯性对于维护系统完整性和诊断问题至关重要,SpringBoot是一种用于构建Java应用程序的流行框架,在本文中,我们探讨了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以参考下
    2023-11-11
  • RxJava中多种场景的实现总结

    RxJava中多种场景的实现总结

    这篇文章给大家详细介绍了RxJava中多种场景的实现,对大家学习使用RxJava具有一定的参考借鉴价值,有需要的朋友们可以参考学习,下面来一起看看吧。
    2016-10-10

最新评论