jstat (JVM Statistics Monitoring Tool) 用于监控虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中类加载、内存、垃圾收集、JIT 编译等运行数据,再没有 GUI 图形的服务器上,它是运行期间定位虚拟机性能问题首选工具。
jstat 位于 java 的 bin 目录下,主要利用 JVM 内建的指令对 Java 应用程序的资源和性能进行实施的命令行的监控,包括了对 Heap size 和垃圾回收状况的监控。可见,Jstat 是轻量级的、专门针对 JVM 的工具,非常适用。
jstat 命令格式
1 | jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] |
参数解释:
- Option — 选项,我们一般使用 -gcutil 查看 gc 情况
- vmid — VM的进程号,即当前运行的java进程号
- interval– 间隔时间,单位为秒或者毫秒
- count — 打印次数,如果缺省则打印无数次
- 参数 interval 和 count 代表查询间隔和次数,如果省略这两个参数,说明只查询一次。假设需要每 250 毫秒查询一次进程 5828 垃圾收集状况,一共查询 5 次,那命令行如下:
1
jstat -gc 5828 250 5
1 | 对于命令格式中的 VMID 与 LVMID 需要特别说明下: |
option
选项 option 代表这用户希望查询的虚拟机信息,主要分为 3 类:类装载、垃圾收集和运行期编译状况,具体选项及作用如下:
class监视类装载、卸载数量、总空间及类装载所耗费的时间gc监视 Java 堆状况,包括 Eden 区、2 个Survivor区、老年代、永久代等的容量gccapacity监视内容与 -gc 基本相同,但输出主要关注 Java 堆各个区域使用到的最大和最小空间gcutil监视内容与 -gc 基本相同,但输出主要关注已使用空间占总空间的百分比gccause与 -gcutil 功能一样,但是会额外输出导致上一次 GC 产生的原因gcnew监视新生代 GC 的状况gcnewcapacity监视内容与 -gcnew 基本相同,输出主要关注使用到的最大和最小空间gcold监视老年代 GC 的状况gcoldcapacity监视内容与 -gcold 基本相同,输出主要关注使用到的最大和最小空间gcpermcapacity输出永久代使用到的最大和最小空间compiler输出 JIT 编译器编译过的方法、耗时等信息printcompilation输出已经被 JIT 编译的方法
常见术语
1、jstat –class<pid> : 显示加载 class 的数量,及所占空间等信息。
Loaded装载的类的数量Bytes装载类所占用的字节数Unloaded卸载类的数量Bytes卸载类的字节数Time装载和卸载类所花费的时间
2、jstat -compiler <pid>显示 VM 实时编译的数量等信息。
Compiled编译任务执行数量Failed编译任务执行失败数量Invalid编译任务执行失效数量Time编译任务消耗时间FailedType最后一个编译失败任务的类型FailedMethod最后一个编译失败任务所在的类及方法
3、jstat -gc <pid>: 可以显示 gc 的信息,查看 gc 的次数,及时间。
S0C年轻代中第一个 survivor(幸存区)的容量 (字节)S1C年轻代中第二个 survivor(幸存区)的容量 (字节)S0U年轻代中第一个 survivor(幸存区)目前已使用空间(字节)S1U年轻代中第二个 survivor(幸存区)目前已使用空间(字节)EC年轻代中 Eden(伊甸园)的容量(字节)EU年轻代中 Eden(伊甸园)目前已使用空间(字节)OCOld 代的容量(字节)OUOld 代目前已使用空间(字节)PCPerm(持久代)的容量(字节)PUPerm(持久代)目前已使用空间(字节)YGC从应用程序启动到采样时年轻代中 gc 次数YGCT从应用程序启动到采样时年轻代中 gc 所用时间(s)FGC从应用程序启动到采样时 old 代(全 gc)gc 次数FGCT从应用程序启动到采样时 old 代(全 gc)gc 所用时间(s)GCT从应用程序启动到采样时 gc 用的总时间(s)
4、jstat -gccapacity <pid>:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小
NGCMN年轻代(young)中初始化(最小)的大小(字节)NGCMX年轻代(young)的最大容量(字节)NGC年轻代(young)中当前的容量(字节)S0C年轻代中第一个 survivor(幸存区)的容量(字节)S1C年轻代中第二个 survivor(幸存区)的容量(字节)EC年轻代中 Eden(伊甸园)的容量(字节)OGCMNold 代中初始化(最小)的大小(字节)OGCMXold 代的最大容量(字节)OGCold代当前新生成的容量(字节)OCOld代的容量 (字节)PGCMNperm 代中初始化(最小)的大小 (字节)PGCMXperm 代的最大容量(字节)PGCperm 代当前新生成的容量(字节)PCPerm(持久代)的容量(字节)YGC从应用程序启动到采样时年轻代中 gc 次数FGC从应用程序启动到采样时 old 代(全gc)gc 次数
5、jstat -gcutil <pid>:统计gc信息
S0年轻代中第一个 survivor(幸存区)已使用的占当前容量百分比S1年轻代中第二个 survivor(幸存区)已使用的占当前容量百分比E年轻代中 Eden(伊甸园)已使用的占当前容量百分比Oold 代已使用的占当前容量百分比Pperm 代已使用的占当前容量百分比YGC从应用程序启动到采样时年轻代中 gc 次数YGCT从应用程序启动到采样时年轻代中 gc 所用时间(s)FGC从应用程序启动到采样时 old 代(全 gc)gc 次数FGCT从应用程序启动到采样时 old 代(全 gc)gc 所用时间(s)GCT从应用程序启动到采样时 gc 用的总时间(s)
6、jstat -gcnew <pid>:年轻代对象的信息。
S0C年轻代中第一个survivor(幸存区)的容量(字节)S1C年轻代中第二个survivor(幸存区)的容量(字节)S0U年轻代中第一个survivor(幸存区)目前已使用空间(字节)S1U年轻代中第二个survivor(幸存区)目前已使用空间(字节)TT持有次数限制MTT最大持有次数限制EC年轻代中 Eden(伊甸园)的容量(字节)EU年轻代中 Eden(伊甸园)目前已使用空间(字节)YGC从应用程序启动到采样时年轻代中 gc 次数YGCT从应用程序启动到采样时年轻代中 gc 所用时间(s)
7、jstat -gcnewcapacity<pid>: 年轻代对象的信息及其占用量。
NGCMN年轻代(young)中初始化(最小)的大小(字节)NGCMX年轻代(young)的最大容量(字节)NGC年轻代(young)中当前的容量(字节)S0CMX年轻代中第一个 survivor(幸存区)的最大容量(字节)S0C年轻代中第一个 survivor(幸存区)的容量(字节)S1CMX年轻代中第二个 survivor(幸存区)的最大容量(字节)S1C年轻代中第二个 survivor(幸存区)的容量(字节)ECMX年轻代中 Eden(伊甸园)的最大容量(字节)EC年轻代中 Eden(伊甸园)的容量(字节)YGC从应用程序启动到采样时年轻代中 gc 次数FGC从应用程序启动到采样时 old 代(全 gc)gc 次数
8、jstat -gcold <pid>:old代对象的信息。
PCPerm(持久代)的容量 (字节)PUPerm(持久代)目前已使用空间 (字节)OCOld代的容量 (字节) OU Old 代目前已使用空间 (字节)YGC从应用程序启动到采样时年轻代中 gc 次数FGC从应用程序启动到采样时 old 代(全gc)gc 次数FGCT从应用程序启动到采样时 old 代(全gc)gc 所用时间(s)GCT从应用程序启动到采样时 gc 用的总时间(s)
9、stat -gcoldcapacity <pid>: old代对象的信息及其占用量。
OGCMNold 代中初始化(最小)的大小 (字节)OGCMXold 代的最大容量(字节)OGCold 代当前新生成的容量 (字节)OCOld 代的容量 (字节)YGC从应用程序启动到采样时年轻代中 gc 次数FGC从应用程序启动到采样时 old 代(全gc)gc 次数FGCT从应用程序启动到采样时 old 代(全gc)gc 所用时间(s)GCT从应用程序启动到采样时 gc 用的总时间(s)
10、jstat -gcpermcapacity<pid>: perm对象的信息及其占用量。
PGCMNperm代中初始化(最小)的大小 (字节)PGCMXperm代的最大容量 (字节)PGCperm代当前新生成的容量 (字节)PCPerm(持久代)的容量 (字节)YGC从应用程序启动到采样时年轻代中 gc 次数FGC从应用程序启动到采样时 old 代(全gc)gc 次数FGCT从应用程序启动到采样时 old 代(全gc)gc 所用时间(s)GCT从应用程序启动到采样时 gc 用的总时间(s)
11、jstat -printcompilation <pid>:当前VM执行的信息。
Compiled编译任务的数目Size方法生成的字节码的大小Type编译类型Method类名和方法名用来标识编译的方法。
类名使用/做为一个命名空间分隔符。方法名是给定类中的方法。上述格式是由-XX:+PrintComplation选项进行设置的