JVM工具-基础监控工具
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和JConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具, 每一种工具都有其自身的特点, 用户可以根据你需要检测的应用或者程序片段的状况,适当的选择相应的工具进行检测, 先通过一个表格形式简要介绍下这几个命令的作用和使用方法。
| 命令 | 作用 | 
|---|---|
| jps | JVM进程ID查询工具 | 
| jstat | JVM统计信息监测工具 | 
| jstack | 查看某个Java进程内的线程堆栈信息 | 
| jmap | jmap导出堆内存,然后使用jhat来进行分析 | 
| jhat | jmap导出堆内存,然后使用jhat来进行分析 | 
| hprof | hprof能够展现CPU使用率,统计堆内存使用情况 | 
jps:JVM进程ID查询工具
可以列出本机所有java进程的pid,很多工具的输入依赖这个pid。
选项
- -q 仅输出VM标识符,不包括class name,jar name,arguments in main method
 - -m 输出main method的参数
 - -l 输出完全的包名,应用主类名,jar的完全路径名
 - -v 输出jvm参数
 - -V 输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
 - -Joption 传递参数到vm,例如:-J-Xms48m
 
示例:
1  | [root@CZT-FS1 board-api]# jps -lvm  | 
我们选取PID=67136的Java进程作为后续研究对象。
jstat:JVM统计信息监测工具
jstat用于监视JVM各种运行状态信息,可显示本地或远程(需要开启RMI支持)虚拟机进程中的类加载、内存、垃圾收集、JIT等运行时数据。 在控制台环境下,它是运行期定位虚拟机性能问题的常用工具。
jstat命令格式:
1  | jstat [option vmid [interval] [count]]  | 
参数interval和count代表查询间隔和次数,如果省略则只查询一次。比如如果要每隔200ms查询一次进程1223垃圾收集状态,一共查询10次。则
1  | jstat -gc 1223 200 10  | 
jstat主要选项如下
| 选项 | 作用 | 
|---|---|
| -class | 监视类加载、卸载数量、总空间以及类装载耗费时间 | 
| -gc | 监视Java堆状况,包括Eden区、2个Suervivor区、老年代、永久代等容量,已用空间,GC合计时间等。 | 
| -gccapacity | 监视内容跟gc基本相同,但主要关注Java堆各个区域使用到的最大、最小空间。 | 
| -gcutil | 监视内容跟gc基本相同,但主要关注已使用空间占总空间百分比。 | 
| -gccause | 监视内容跟gcutil基本相同,但会额外输出导致上一次GC原因。 | 
| -gcnew | 监视新生代GC状态 | 
| -gcnewcapacity | 监视内容跟gcnew基本相同,输出主要关注使用到的最大、最小空间。 | 
| -gcold | 监视老年代GC状态 | 
| -gcoldcapacity | 监视内容跟gcold基本相同,输出主要关注使用到的最大、最小空间。 | 
| -gcpermcapacity | 监视永久代使用到的最大、最小空间。 | 
| -compiler | 输出JIT编译过的方法、耗时信息 | 
| -printcompilation | 输出已经被JIT编译的方法 | 
jstat执行样例:
1  | jstat -gcutil 12592  | 
| 缩写 | 含义 | 原文 | 
|---|---|---|
| S0 | 新生代中Survivor space 0区已使用空间的百分比 | Survivor space 0 utilization as a percentage of the space’s current capacity. | 
| S1 | 新生代中Survivor space 1区已使用空间的百分比 | Survivor space 1 utilization as a percentage of the space’s current capacity. | 
| E | 新生代已使用空间百分比 | Eden space utilization as a percentage of the space’s current capacity | 
| O | 老年代已使用空间百分比 | Old space utilization as a percentage of the space’s current capacity. | 
| M | 元空间 | Metaspace utilization as a percentage of the space’s current capacity | 
| CCS | 压缩类空间利用率百分比 | Compressed class space utilization as a percentage | 
| YGC | YGC事件的数量 | Number of young generation GC events. | 
| YGCT | 年轻一代垃圾收集时间 | Young generation garbage collection time | 
| FGC | FGC事件的数量 | Number of full GC events. | 
| FGCT | 完全垃圾收集时间 | Full garbage collection time | 
| CGC | 并发GC统计 | Concurrent GC Count | 
| CGCT | 并发GC收集时间 | Concurrent GC Collection Time | 
| GCT | 垃圾回收总时间 | Total garbage collection time. | 
CGC和CGCT是ZGC的标志,ZGC(The Z Garbage Collector)是JDK 11中推出的一款低延迟垃圾回收器,是一个并发垃圾回收器。
jmap:Java内存映像工具
jmap命令用于生成堆转储快照,一般称为heapdump或dump文件,该工具在JDK9中集成到了JHSDB中。
命令格式:jmap [option] vmid
option的几个主要选项如下
| 选项 | 作用 | 
|---|---|
| -dump | 生成dump文件,格式为-dump:[live,]format=b,file= | 
| -finalizerinfo | 显示在F-Queue中等待finalizer线程执行finalize方法的对象 | 
| -heap | 显示堆详细信息,比如使用的回收器、参数配置、分代情况 | 
| -histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 | 
| -pemstat | 以ClassLoader为统计口径显示永久代内存状态 | 
| -F | 强制生成dump快照,这个在-dump选项没有响应时使用 | 
使用jmap的样例
1  | C:\Users\xiongneng>jmap -dump:format=b,file=test.dump 12592  | 
top使用
除了常用的打印所有进程使用资源外,还可以对单独的进程,打印线程资源排行榜,按T键可对TIME倒序排列,也就是CPU运行时间。 TIME列就是各个Java线程耗费的CPU时间,我们线程pid为67163的线程作为后续线程研究对象
1  | [root@CZT-FS1 board-api]# top -Hp 67136  | 
jstack:线程堆栈跟踪工具
jstack主要用来查看某个Java进程内的线程堆栈信息,生成的文件一般称为threaddump或javacore文件。 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成线程快照目的通常是定位线程出现停顿原因。 比如线程死锁、死循环、请求外部资源导致长时间挂起等。
该工具在JDK9中已集成到了JHSDB中。
语法格式如下:
1  | jstack [option] vmid  | 
| 选项 | 作用 | 
|---|---|
| -F | 正常输出的请求不被响应时,强制输出线程堆栈 | 
| -l | 除了堆栈外,还会输出关于锁的附加信息 | 
| -m | 如果调用本地方法,可显示C/C++堆栈信息 | 
1  | [root@CZT-FS1 board-api]# jstack -l 67136 | more  | 
如果想要查看某个线程的堆栈,先使用上面的top命令查看到线程ID号,然后使用printf "%x\n",获得该线程ID的十六进制值。
1  | [root@CZT-FS1 board-api]# printf "%x\n" 67163  | 
查看该线程的堆栈:
1  | [root@CZT-FS1 board-api]# jstack -l 67136 | grep 1065b -A20  |