概述
Jstat 查看某个Java进程内的线程堆栈信息,用于监控基于HotSpot的JVM,对其堆的使用情况进行实时的命令行的统计,使用jstat我们可以对指定的JVM做如下监控:
- 类的加载及卸载情况
- 查看新生代、老生代及持久代的容量及使用情况
- 查看新生代、老生代及持久代的垃圾收集情况,包括垃圾回收的次数及垃圾回收所占用的时间
- 查看新生代中Eden区及Survior区中容量及分配情况等
常用命令及输出分析
1、总结垃圾回收统计
$ jstat -gcutil 19148 1000 10
每1秒一次显示进程号为 19148的 java进成的 GC情况(只打印10次),结果如下图:
如何判断应用程序是否有内存的问题:
1. Full GC的频率,时长和效果: 如果Full GC频率较高,比如数秒一次,那么此时程序可能就已经出问题了,因为jvm在Full GC的时候是不响应外部请求的。
如果Full GC时间较长,比如持续数秒,那么此时程序可能就已经出问题了,因为jvm在Full GC的时候是不响应外部请求的。
如果Full GC之后old 区内存没有显著减少,那么程序很可能有内存泄露问题,并且不久将来可能出现outofmemory异常。
如果young gc和full gc能够正常发生,且都能有效回收内存,常驻内存区变化不明显,则说明java内存释放情况正常,垃圾回收及时,java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。
2. GC的频率,时长和效果: 如果JVM进行内存回收的频率非常高,比如几乎每数秒中就有一次,每次回收的时间为数秒钟;并且,通过输出还发现每次回收释放的内存非常有限,大多数对象都无法回收。这种现象很大程度上暗示着内存泄漏。(此时可以用“jmap”来获得当前的一个内存映象,看看哪些对象导致这个问题来找出原因)
如果每次GC时间特别长,比如说数十秒,那这种现象很大程度上暗示着内存泄漏。(内存中对象太多,导致遍历时间太长,有时候不好的缓存机制会造成这样的问题)
完整语法详解
官方详细文档
jstat [Options] vmid [interval] [count]
命令参数说明:
Options,一般使用 -gcutil 或 -gc 查看gc 情况
pid,当前运行的 java进程号
interval,间隔时间,单位为秒或者毫秒
count,打印次数,如果缺省则打印无数次
PS:不同的操作系统支持的选项可能会不一样,可以通过-options选项,查看不同操作系统所支持选项。(下图为公司服务器所支持的选项)
Option |
Displays... |
class |
用于查看类加载情况的统计 |
compiler |
用于查看HotSpot中即时编译器编译情况的统计 |
gc |
用于查看JVM中堆的垃圾收集情况的统计 |
gccapacity |
用于查看新生代、老生代及持久代的存储容量情况 |
gccause |
用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。 |
gcnew |
用于查看新生代垃圾收集的情况 |
gcnewcapacity |
用于查看新生代的存储容量情况 |
gcold |
用于查看老生代及持久代发生GC的情况 |
gcoldcapacity |
用于查看老生代的容量 |
gcpermcapacity |
用于查看持久代的容量 |
gcutil |
用于查看新生代、老生代及持代垃圾收集的情况 |
printcompilation |
HotSpot编译方法的统计 |