摘要:本文深入解析Java虚拟机(JVM)的核心监控工具jstat,涵盖12种关键监控场景,助力开发者精准诊断内存、GC及类加载问题。


1. 类加载与卸载监控(-class)

命令jstat -class <pid>

输出字段

  • Loaded:已加载类总数
  • Bytes:加载类占用的字节数
  • Unloaded:卸载的类数量
  • Time:类加载/卸载总耗时(秒)

    问题诊断
  • 类泄漏Loaded 持续上升且 Unloaded 接近 0,可能是动态代理或反射滥用导致。
  • 优化建议:限制元空间大小(-XX:MaxMetaspaceSize),检查代码中重复类加载逻辑。

2. JIT 编译监控(-compiler)

命令jstat -compiler <pid>

输出字段

  • Compiled:成功编译的方法数
  • Failed:编译失败的方法数
  • Invalid:无效编译数(需重新编译的方法)

    问题诊断
  • 编译失败Failed > 0 表明存在热点方法无法优化(如复杂循环或异常分支)。
  • 优化建议:检查 FailedMethod 列定位问题方法,简化逻辑或排除编译异常。

3. GC 行为全景监控(-gc)

命令jstat -gc <pid> 1000 5(每秒采样,共5次)

核心字段

区域 容量字段 使用字段
Eden EC EU
Survivor S0C/S1C S0U/S1U
老年代 OC OU
元空间 MC MU
GC 统计YGC(Young GC 次数)、FGC(Full GC 次数)、GCT(GC 总耗时)。
典型问题
  • Eden 区溢出EU 频繁接近 EC → Young GC 频繁(增大 -Xmn)。
  • 老年代满OU 持续增长且 FGC 增加 → 内存泄漏(检查对象生命周期)。

4. 堆内存使用率监控(-gcutil)

命令jstat -gcutil <pid> 1s

输出字段(百分比形式):

  • E:Eden 区使用率
  • O:老年代使用率
  • M:元空间使用率
  • YGC/FGC:GC 次数

    诊断场景
  • 老年代压力O > 90%FGC 增长 → 可能触发 Full GC(调整 -Xmx 或换 G1/ZGC)。
  • 元空间溢出M ≈ 100% → 动态类生成过多(限制 -XX:MaxMetaspaceSize)。

⚖️ 5. 堆内存容量分析(-gccapacity)

命令jstat -gccapacity <pid>

关键字段

  • NGCMN/NGCMX:新生代最小/最大容量
  • OGCMN/OGCMX:老年代最小/最大容量
  • MCMN/MCMX:元空间最小/最大容量

    用途
  • 观察 JVM 动态扩容行为(如 OC 增长),判断是否因堆过小导致频繁扩容。

6. GC 原因追踪(-gccause)

命令jstat -gccause <pid> 1s

扩展字段(在 -gcutil 基础上):

  • LGCC:最近一次 GC 的原因(如 Allocation Failure
  • GCC:当前 GC 原因(如 No GC

    典型原因
  • Allocation Failure:Eden 区满触发 Young GC。
  • System.gc():代码中显式调用 GC(避免使用)。

7. 新生代详细分析(-gcnew)

命令jstat -gcnew <pid>

关键字段

  • TT:对象晋升老年代的年龄阈值
  • MTT:对象最大存活年龄
  • DSS:期望的 Survivor 区大小

    优化方向
  • 对象过早晋升TT 过小 → 增大 -XX:MaxTenuringThreshold 让对象在新生代多存活几轮 GC。

8. 老年代与元空间分析(-gcold)

命令jstat -gcold <pid>

核心字段

  • OU:老年代使用量
  • MU:元空间使用量
  • FGCT:Full GC 总耗时

    问题定位
  • Full GC 频繁OU 持续高位 → 检查大对象或内存泄漏(使用 jmap 生成堆转储)。

9. 元空间容量监控(-gcmetacapacity)

命令jstat -gcmetacapacity <pid>

字段MCMN(最小元空间)、MCMX(最大元空间)、MC(当前元空间)

配置建议

  • 设置 -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m 避免元空间无限增长。

10. 新生代内存容量(-gcnewcapacity)

命令jstat -gcnewcapacity <pid>

字段NGCMN/NGCMX(新生代最小/最大容量)、EC(Eden 当前容量)

调优场景

  • Eden 区过小导致频繁 Young GC → 增大 -Xmn(新生代大小)。

11. 老年代内存容量(-gcoldcapacity)

命令jstat -gcoldcapacity <pid>

字段OGCMN/OGCMX(老年代最小/最大容量)、OGC(当前老年代容量)

诊断

  • 老年代容量不足触发 Full GC → 增加 -Xmx 或降低新生代与老年代比例。

12. 方法区监控(-printcompilation)

命令jstat -printcompilation <pid>

字段Compiled(编译次数)、Size(方法字节码大小)、Method(方法名)

用途

  • 识别 JIT 编译的热点方法,优化其性能(如内联或循环展开)。

⚙️ 调优总结与工具链整合

场景 关键命令 优化动作
Young GC 频繁 jstat -gcutil 增大 -Xmn,调整 -XX:SurvivorRatio
Full GC 频繁 jstat -gccause 增大堆内存,换 G1/ZGC,修复内存泄漏
元空间溢出 jstat -gcmetacapacity 限制 -XX:MaxMetaspaceSize
类加载泄漏 jstat -class 检查动态代理,限制类加载器作用域

最佳实践建议

  1. 自动化监控:通过 Shell 脚本定期采集 jstat 数据,结合 grep/awk 分析异常阈值并触发告警。
  2. 多工具联动
    • jmap 导出堆转储分析大对象(jmap -dump:format=b,file=heap.hprof <pid>)。
    • jstack 抓取线程快照排查死锁(jstack <pid> > thread.txt)。
  3. 可视化分析:上传 GC 日志到 https://gceasy.io 生成吞吐量、延迟报告。

通过这 12 个场景的深度监控,可覆盖 90% 的 JVM 性能问题。记住黄金法则:优先让对象在新生代回收(减少 FGC),避免老年代积压。

JVM监控利器:jstat命令全方位详解的更多相关文章

  1. Java的jstat命令使用详解

    jstat命令简介 jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态信息的命令行工具.它 ...

  2. JAVA命令参数详解

    JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...

  3. 软RAID管理命令mdadm详解

    软RAID管理命令mdadm详解 mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的 ...

  4. Linux网络状态工具ss命令使用详解【转】

    ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...

  5. [转帖]强大的strace命令用法详解

    强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...

  6. Linux 执行文件查找命令 which 详解

    某个文件不知道放在哪里了,通常可以使用下面的一些命令来查找: which  查看可执行文件的位置 whereis 查看文件的位置 locate   配合数据库查看文件位置 find   实际搜寻硬盘查 ...

  7. systemctl命令用法详解

    systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...

  8. 批处理中的echo命令图文详解

    批处理中的echo命令图文详解 1. Echo 显示当前ECHO的状态:ECHO ON 或者ECHO OFF 2. ECHO ON 将ECHO状态设置为ON,将显示命令行,也就是前面的C:\>类 ...

  9. Ubuntu kill命令用法详解

    转自:Ubuntu kill命令用法详解 1. kill   作用:根据进程号杀死进程   用法: kill [信号代码] 进程ID   root@fcola:/# ps -ef | grep sen ...

  10. install 命令用法详解

    install 命令用法详解 http://man.linuxde.net/install install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似 ...

随机推荐

  1. Faray 数列问题

    首先,Farey 数列 \(F_n\) 表示分母不超过 \(n\) 的所有既约真分数按大小顺序排列的集合,形式化来说 \[F_n = \left\{\frac{p}{q} \bigg\vert 0 & ...

  2. python学习思维导图分享

    python 本文包含了我的一些python学习的笔记和思维导图 第一部分:python基础 导图下载链接 第二部分:函数及其他文件操作 导图下载链接 第三部分:类及网络编程 导图下载链接 第四部分: ...

  3. Spring扩展接口-ApplicationContextInitializer

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  4. [书籍精读]《JavaScript设计模式与开发实践》精读笔记分享

    写在前面 书籍介绍:本书在尊重<设计模式>原意的同时,针对JavaScript语言特性全面介绍了更适合JavaScript程序员的了16个常用的设计模式,讲解了JavaScript面向对象 ...

  5. 三种熔断策略在数据服务API中的实践应用

    熔断策略的概念最早可以追溯到电力系统中的保险丝.当电流过大时,保险丝会自动熔断,以防止电器设备因过载而损坏.这种简单而有效的保护机制为后来软件系统中的熔断策略提供了灵感.在软件系统中,熔断策略的工作原 ...

  6. 数栈 × AWS EMR On EC2 适配实践:打造出海企业可落地的云上数据中台解决方案

    随着袋鼠云全面推进数栈产品的出海战略,我们在服务多个头部出海客户的过程中发现,真正做好"海外可用"的数据平台,关键不仅在于部署全球化,还在于深入适配 AWS 的核心计算平台EMR, ...

  7. qiankunjs中vue路由使用hash模式

    为什么使用hash模式 官网上举例都是拿history模式,我就想看看hash模式 history模式优在编译后缺点 file协议访问会白屏,即打包完成后,双击页面会白屏(之后还证明qiankun的微 ...

  8. java 数据传递? 两个对话框之间

    简介 java 数据传递,简单通过类对象传递? 两个对话框之间 Q&A 但是不知道是如何实现模态的对话框的,看了几遍也还不知道? JDialog 第二个参数就是模态和非模态的选择 code p ...

  9. 解决EasyExcel读取日期为1905年

    问题 用EasyExcel导入Excel的时候读取日期出现问题,部分日期读取变成1905年 Excel中的日期格式比较特别,是yyyy.MM格式的,和数字类型的小数非常相似 和Excel中的日期对不上 ...

  10. java中整数常量池(-128~127)上限如何调整?

    众所周知:java中Integer有一个常量池范围-128~127 Integer a = 500, b = 500; System.out.println(a == b);//false a = 1 ...