JVM监控利器:jstat命令全方位详解
摘要:本文深入解析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 |
检查动态代理,限制类加载器作用域 |
最佳实践建议
- 自动化监控:通过 Shell 脚本定期采集
jstat数据,结合grep/awk分析异常阈值并触发告警。 - 多工具联动:
- 用
jmap导出堆转储分析大对象(jmap -dump:format=b,file=heap.hprof <pid>)。 - 用
jstack抓取线程快照排查死锁(jstack <pid> > thread.txt)。
- 用
- 可视化分析:上传 GC 日志到 https://gceasy.io 生成吞吐量、延迟报告。
通过这 12 个场景的深度监控,可覆盖 90% 的 JVM 性能问题。记住黄金法则:优先让对象在新生代回收(减少 FGC),避免老年代积压。
JVM监控利器:jstat命令全方位详解的更多相关文章
- Java的jstat命令使用详解
jstat命令简介 jstat(Java Virtual Machine Statistics Monitoring Tool)是JDK提供的一个可以监控Java虚拟机各种运行状态信息的命令行工具.它 ...
- JAVA命令参数详解
JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...
- 软RAID管理命令mdadm详解
软RAID管理命令mdadm详解 mdadm是linux下用于创建和管理软件RAID的命令,是一个模式化命令.但由于现在服务器一般都带有RAID阵列卡,并且RAID阵列卡也很廉价,且由于软件RAID的 ...
- Linux网络状态工具ss命令使用详解【转】
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...
- [转帖]强大的strace命令用法详解
强大的strace命令用法详解 文章转自: https://www.linuxidc.com/Linux/2018-01/150654.htm strace是什么? 按照strace官网的描述, st ...
- Linux 执行文件查找命令 which 详解
某个文件不知道放在哪里了,通常可以使用下面的一些命令来查找: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查 ...
- systemctl命令用法详解
systemctl命令用法详解系统环境:Fedora 16binpath:/bin/systemctlpackage:systemd-units systemctl enable httpd.serv ...
- 批处理中的echo命令图文详解
批处理中的echo命令图文详解 1. Echo 显示当前ECHO的状态:ECHO ON 或者ECHO OFF 2. ECHO ON 将ECHO状态设置为ON,将显示命令行,也就是前面的C:\>类 ...
- Ubuntu kill命令用法详解
转自:Ubuntu kill命令用法详解 1. kill 作用:根据进程号杀死进程 用法: kill [信号代码] 进程ID root@fcola:/# ps -ef | grep sen ...
- install 命令用法详解
install 命令用法详解 http://man.linuxde.net/install install命令的作用是安装或升级软件或备份数据,它的使用权限是所有用户.install命令和cp命令类似 ...
随机推荐
- Pod原理以及Pod生命周期
一.Pod的介绍 1.为什么需要Pod? 假设 Kubernetes 中调度的基本单元就是容器,对于一个非常简单的应用可以直接被调度直接使用,没有什么问题,但是往往还有很多应用程序是由多个进程组成的, ...
- onnxruntime-gpu创建会话时报错:Could not load symbol cudnnGetLibConfig. Error code 127
最近在新的设备上做模型的demo,模型训练好之后,我习惯的拉取了我基于pyqt5和onnxruntime的demo演示代码,我按照我的cuda和cudnn环境,安装了1.19的onnxruntim ...
- 阿里微服务解决方案-Alibaba Cloud之集成Nacos(服务注册与发现)(三)
一.集成 Nacos(服务注册与发现) 1.1 下载 Nacos Nacos下载地址 1.2 下载后解压到本地 1.3 启动 Nacos 启动成功界面 输入 http://127.0.0.1:8848 ...
- HZOI NOIP 2024 Round 24 T2 取石子 官方做法
发现大多数的题解都是不同于官方题解的做法,这里我将介绍官方题解做法. Solution 证明先手是否可以必胜的方法相差无几,为了方便后边行文,这里介绍我的思路:考虑各堆石子和为奇数的情况(以下简称为& ...
- 解决VMware Workstation安装VMware Tools显示灰色的办法
想在VMware Workstation中安装VMware Tools,方便文件的复制粘贴.但是如下图,总是灰色 按照网上教程设置 方法一: 1.关闭虚拟机: 2.在虚拟机设置分别设置CD/DVD.C ...
- inno setup 6 打包C# winform 程序安装包
注: checkablealone "选中"意思unchecked "非选中"意思 图标选择:IconFilename: "{app}\Images\ ...
- Spring基础-AOP
AOP AOP:面向切面编程 Spring 的Aop是为了解耦.弥补OOP的不足. Spring支持Aspect J的注解式切面编程 使用@Aspect是一个切面 使用@After.@Before.@ ...
- node安装与使用
nvm for mac/linx 安装 使用yum安装node,最新只能安装到0.12.X 版本,而自定义安装二进制的又有点麻烦,所以用nvm安装 (如果命令下载不下来 可以手动下载到服务器上执行). ...
- vuepress自动生成侧边栏
vuepress-theme-sidebar vuepress-theme-sidebar 一款用于vuepress2.x的自动生成导航栏的主题. 说明 仓库地址:https://github.com ...
- 前端开发系列065-JQuery篇之框架简单介绍
一.jQuery简介 jQuery是一款优秀的javaScript库(框架),该框架凭借简洁的语法和跨平台的兼容性,极大的简化了开发人员对HTML文档,DOM,事件以及Ajax的操作. 主旨口号:写的 ...