编辑
“工欲善其事必先利其器”。
一、命令行工具
1. jps
JVM Process Status Tool,显示虚拟机进程。这个命令的使用频率很高,当服务器上运行大量Java项目的时候,系统管理员会通过该命令来查看对应的进程是否启动。
用法:jps [-q] [-mlvV]
参数说明
- -q:打印进程号
- -l:打印启动类的全限定名
- -m:打印启动类的 main 方法入参
- -v:打印指定的虚拟机参数
- -V:打印类名
例子:jps
、jps -l
编辑
2、jstat
JVM statistics Monitoring,对Java虚拟机内存进行监控统计,包括类装载、内存、垃圾收集、JIT编译信息等。该命令通常与jps命令一起使用,先通过jps查看当前服务器上运行有哪些进程,获取到对应的进程号后再使用jstat来查看该进程的具体信息。
用法:jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数说明
- option:操作,参数比较多,常用的是
gcutil
,统计垃圾回收情况。
- -class:监控类装载,卸载数量,总空间以及消费的时间
- -gc:垃圾回收堆的行为统计(常用命令)
- -gccapacity:同-gc,同时还会输出JAVA堆各区域的使用到的最大、最小空间
- -gcutil:同-gc,输出的是已使用空间占总空间的百分比
- -gccause:在-gcutil的基础上附加最近两次垃圾回收时间的原因
- -t:显示时间戳列
- -h:指定多少行显示标题
- -vmid:进程ID
- -interval:每行输出的时间间隔
- -count:指定输出行数
例子:jstat -gcutil -h2 -t 11904 100 5
,表示监控进程号11904
的垃圾收集统计值,每隔100ms输出一行,总共输出5次,每输出2次需要重新输出标题。
D:\>jstat -gcutil -h2 -t 11904 100 5 Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1252.1 0.00 76.18 87.85 0.01 96.10 93.02 1 0.007 0 0.000 0.007 1252.2 0.00 76.18 87.85 0.01 96.10 93.02 1 0.007 0 0.000 0.007 Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1252.3 0.00 76.18 87.85 0.01 96.10 93.02 1 0.007 0 0.000 0.007 1252.5 0.00 76.18 87.85 0.01 96.10 93.02 1 0.007 0 0.000 0.007 Timestamp S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 1252.6 0.00 76.18 87.85 0.01 96.10 93.02 1 0.007 0 0.000 0.007
输出的指标说明
- S0:survivor 0 已用空间占比
- S1:survivor 1 已用空间占比
- E:Eden 区已用空间占比
- O:老年代已用空间占比
- M:元数据已用空间占比
- CCS:压缩类空间占比
- YGC:Minor GC 次数
- YGCT:Minor GC 消耗时间
- FGC:Full GC 次数
- FGCT:Full GC 消耗时间
- GCT:垃圾回收消耗总时间
元空间M就是永久代的替代产物。
3. jinfo
JVM Configuration info,可以实时查看和实时修改虚拟机参数。jinfo 是 JDK 自带的命令,可以用来查看正在运行的 java 应用程序的扩展参数,包括Java System属性和JVM命令行参数;也可以动态的修改正在运行的 JVM 一些参数。当系统崩溃时,jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息
用法:jinfo [option] <pid>
参数说明
- option:操作
-flag 打印指定的VM参数的值
-flag [+|-] 启用或禁用指定的VM参数
-flag = 修改VM参数
-flags 打印VM参数
-sysprops 打印Java系统配置
- pid:进程ID
例子:
#查看指定的进程是否使用了G1垃圾回收器 D:\>jinfo -flag UseG1GC 11904 -XX:-UseG1GC
4. jmap
JVM Memory Map,用来生成堆栈dump文件。可查看的信息如下:
- 查看堆各个对象的数量,大小
- dump堆里的对象信息,然后可以用MAT分析
- 查看堆的配置情况和GC算法
- 查看堆永久代信息
用法:jmap [option] <pid>
参数说明
- option:操作
heap:打印Java堆摘要
histo[:live]:打印java对象堆的直方图; 如果指定了“live”选项,则仅计算实时对象
dump:生成dump快照
- pid:进程ID
例子:
jmap -heap 15754 jmap -histo:live 15754 jmap -dump:live,file=.\heap_dump.hprof 15754
5. jstack
用来生成Java虚拟机当前时刻的线程快照,方便定位线程长时间停顿的问题,比如死锁、死循环、长时间等待等。
用法:jstack -F [-m] [-l] <pid>
参数说明
- -F:强制打印堆栈
- -m:同时打印Java和本地方法的堆栈
- -l:打印关于锁的附件信息
- pid:进程ID
例子:
D:\>jstack -l 11904 2020-04-03 15:54:36 Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.211-b12 mixed mode): "RMI TCP Connection(idle)" #36 daemon prio=5 os_prio=0 tid=0x000000001a27a000 nid=0x3bd0 waiting on condition [0x000000001c3ee000] java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x00000000d0687c48> (a java.util.concurrent.SynchronousQueue$TransferStack) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362) at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:941) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1073) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Locked ownable synchronizers: - None
这个打印的信息跟我们在Java代码中使用Thread.getAllStackTraces()方法获取的内容是一致的。
6. jhat
JVM Heap Analysis Tool,用来分析jmap生成的堆栈日志,生成HTML文件。jhat命令对于内存和cpu的占用率非常高,通常不会在服务器上直接进行分析,而是拷贝到本地再进行分析。该命令执行完毕后会启动一个简易的HTTP服务,端口号是7000,本地可以通过http://localhost:7000访问,生成的html页面如下所示:
编辑
查看堆异常主要关注两个:
- Show instance counts for all classes (excluding platform) 平台外的所有对象信息
- Show heap histogram 先是堆的统计信息
这个命令功能非常强大,但使用率不是很高,我们一般会用可视化工具来分析堆栈日志,比如MAT。
7. jcmd
JDK建议使用 jcmd 替代 jstack、jinfo、jmap 等命令。
例子
- jcmd -l:列出所有Java虚拟机。
- jcmd 15754 help:列出该虚拟机支持的命令。
- jcmd 15754 PerfCounter.print:获取所有性能相关的数据。
- jcmd 15754 GC.class_histogram
二、可视化工具
jconsole:JDK自带监控工具:内存监控、线程监控、检测死锁
编辑
编辑
jvisualvm:JDK自带监控工具,比jconsole显示更多监控数据
编辑
jmc:也是JDK自带监控工具,比jvisualvm显示更多监控数据
编辑
MAT:Memory Analyzer Tool,Java虚拟机内存分析工具,能够快速的分析dump日志。
官网下载地址:Eclipse Memory Analyzer Open Source Project | The Eclipse Foundation
编辑
三、虚拟机工具思维导图
编辑
参考资料: