jstat

jstat 用来显示 JVM 的某些指标的统计信息, 可以每隔固定时间采集一次,设置共采集多少次. 主要用来采集 GC 和运行时编译相关的统计信息.

比如下面诊断为什么系统一直 full GC, 最后发现是人为的调用 System.gc().

jstat -gccause 332 3s 5 //332 是进程id, 每 3s 采集一次, 共采集 5 次z

image1.png

下面这个例子采集 GC 的统计信息, S0, S1 分别代表 survivor 0 和 survivor 1, E 代表 Eden, O 代表 Old, P 代表 Permermanent, C 代表 Capacity, U 代表 Used. YGC 和 FGC 分别代表 Young generation 和 Full generation GC, 后面的 T 代表花费的的时间 (Time)

jstat -gc 332 3s 5

image2.png

另外 -options 显示所有可以采集的项目

$ ./jstat -options
-class
-compiler
-gc
-gccapacity
-gccause
-gcnew
-gcnewcapacity
-gcold
-gcoldcapacity
-gcpermcapacity
-gcutil
-printcompilation

jps

jps 相当于 Linux ps命令, 不过它只显示 java 进程. 通常我们我们为了做 thread dump, heap dump 的第一步就是找到这个进程 id, jps 能很快的帮我们找到这个进程 id. 默认情况下 jps 只会显示当前用户的 java 进程, 如果要查看的应用程序是属于另外一个用户的进程, 那么要切换到另外一个用户, 或者使用 sudo jps.

workstation:~ xiatian$ jps
10824 Jps
95833 gcviewer-1.36-SNAPSHOT.jar

// -v 显示启动 jvm 时候的参数

workstation:~ xiatian$ jps -v 
10833 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk-11.0.3.jdk/Contents/Home -Xms8m -Djdk.module.main=jdk.jcmd
95833 gcviewer-1.36-SNAPSHOT.jar

//显示 main 函数的全包名, 如果是 jar 的话, 显示全路径

workstation:~ xiatian$ jps -l
10836 jdk.jcmd/sun.tools.jps.Jps
95833 /Users/xiatian/Desktop/gcviewer-1.29/gcviewer-1.36-SNAPSHOT.jar