如何判断JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常?一般的top指令基本上满足不了这样的需求,因为它主要监控的是总体的系统资源,很难定位到java应用程序。
Jstat是JDK自带的一个轻量级小工具,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。
下面介绍几个常用的方法:
Option | Displays... |
class | 用于查看类加载情况的统计 |
compiler | 用于查看HotSpot中即时编译器编译情况的统计 |
gc | 用于查看JVM中堆的垃圾收集情况的统计 |
gccapacity | 用于查看新生代、老生代及持久代的存储容量情况 |
gccause | 用于查看垃圾收集的统计情况(这个和-gcutil选项一样),如果有发生垃圾收集,它还会显示最后一次及当前正在发生垃圾收集的原因。 |
gcnew | 用于查看新生代垃圾收集的情况 |
gcnewcapacity | 用于查看新生代的存储容量情况 |
gcold | 用于查看老生代及持久代发生GC的情况 |
gcoldcapacity | 用于查看老生代的容量 |
gcpermcapacity | 用于查看持久代的容量 |
gcutil | 用于查看新生代、老生代及持代垃圾收集的情况 |
printcompilation | HotSpot编译方法的统计 |
简单事例:
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -class 1179 Loaded Bytes Unloaded Bytes Time 15372 33032.9 0 0.0 23.63
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
S0C 年轻代中第一个survivor(幸存区)的容量 (字节) | S1C | S0U | S1U | EC | EU | OC (Old代的容量) | OU (Old代目前已使用空间) | PC | PU | YGC (young gc的次数) | YGCT (young gc的时间) | FGC (full gc的次数) | FGCT (full gc的时间) | GCT (gc的总时间) |
104832 | 104832 | 907.9 | 0 | 838912 | 838912 | 1048576 | 416891.5 | 152132 | 119891.3 | 4180 | 27.036 | 2 | 0.488 | 27.524 |
参数解释
S0 — Heap上的 Survivor space 0 区已使用空间的百分比
S1 — Heap上的 Survivor
space 1 区已使用空间的百分比
E — Heap上的 Eden space
区已使用空间的百分比
O — Heap上的 Old space 区已使用空间的百分比
P —
Perm space 区已使用空间的百分比
YGC — 从应用程序启动到采样时发生 Young GC 的次数
YGCT– 从应用程序启动到采样时
Young GC 所用的时间(单位秒)
FGC — 从应用程序启动到采样时发生 Full GC 的次数
FGCT– 从应用程序启动到采样时 Full
GC 所用的时间(单位秒)
GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)