Java jstat 怎么用
Java jstat 怎么用?普通人也能懂的JVM监控小工具
很多程序员刚接触Java项目时,都会遇到应用突然变卡、反应变慢的情况,第一反应可能是找日志、改代码,却忽略了JVM本身的“身体状态”。其实Java自带了一个超好用的轻量监控工具——jstat,它不用安装额外软件,打开命令行就能用,就像给JVM做“常规体检”,看完就能快速排查问题。
很多人觉得JVM监控都是高大上的术语,其实jstat的用法特别接地气,就像你用手机的“电池健康”功能看耗电一样简单。我们先从最基础的操作开始,比如先确定要监控哪个Java进程。打开命令行,输入jps(这也是Java自带的小工具),就能看到当前运行的Java进程,像“1234 MyApp”里的1234,就是我们要监控的进程ID,这个步骤就像给体检的人报身份证号,先锁定对象。

找到进程ID后,就能用jstat查具体数据了。最常用的是查看JVM堆内存的使用情况,命令是jstat -gc 进程ID 间隔时间。比如输入jstat -gc 1234 1000,意思是每隔1000毫秒(也就是1秒),就输出一次这个进程的堆内存数据。这里的“堆内存”可以理解成JVM给Java对象准备的“储物柜”,新创建的对象都放在这里,储物柜的大小和剩余空间,直接关系到应用会不会卡。
举个生活化的例子:你租了一个100升的储物间(对应JVM的堆内存),里面放着你平时用的衣服、书本(对应Java对象)。jstat输出的第一个指标S0C和S1C,就是储物间里两个“备用小隔间”的总容量;S0U和S1U是这两个隔间已经用了多少;EC是“常用大隔间”的总容量,EU是已经用了多少;最后还有OC(老年代总容量)、OU(老年代已用),这些数据加起来,就是整个储物间的使用情况。
如果发现OU(老年代已用)很快接近OC(老年代总容量),甚至经常触发垃圾回收,那说明储物间快满了,你可能需要整理一下没用的旧东西(也就是手动触发垃圾回收,命令是jmap -histo:live 进程ID,不过这是后话),或者考虑换个更大的储物间(调整JVM堆内存参数)。
除了堆内存,jstat还能查垃圾回收的频率和耗时,命令是jstat -gcutil 进程ID 间隔时间,这里的util就是“使用率”的意思,输出的YGC是年轻代垃圾回收的次数,YGCT是年轻代回收花的时间;FGC是老年代Full GC的次数,FGCT是老年代回收花的时间。比如你看到FGC每分钟都在涨,而且FGCT每次都超过1秒,那应用突然卡顿,大概率就是Full GC在“整理储物间”,这时候就得排查是不是有大量没用的旧对象占着空间了。
还有个小技巧,如果想一次性看3次数据,不用一直刷新,可以加个次数参数,比如jstat -gc 1234 1000 3,这样就会每隔1秒输出一次,总共输出3次,方便你对比变化,就像拍三张不同时间的储物间照片,看东西是怎么增加、怎么整理的。
很多新手怕用错命令,其实jstat的参数不用死记,输入jstat -help就能看到所有可用的参数,比如-gcnew看年轻代细节、-gcold看老年代细节,都是很实用的小功能。不用把它想得太复杂,它就是JVM自带的“便携体检仪”,不用装别的软件,打开命令行就能用,遇到Java应用卡顿、内存溢出的问题,先用jstat查一查,就能快速找到问题的苗头,比盲目找日志高效多了。