JVM 监控工具
官方手册:https://docs.oracle.com/javase/8/docs/technotes/tools/index.html
一、命令行监控工具
1. jps(JVM Process Status Tool)
功能: 列出正在运行的虚拟机并显示虚拟机执行主类名称
主要参数:
-q: 只显示进程ID
-m: 显示传递给main方法的参数
-l: 显示应用程序mian方法名称或jar文件的路径名
-v: 显示传递给JVM虚拟机的参数
实例:
- 列出正在运行的jvm进程id
$ jps
16420 Bootstrap
32375 Jps
- 显示传递给JVM虚拟机的参数
$ jps -v
16420 Bootstrap -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
32333 Jps -Denv.class.path=.:/home/ubuntu/software/jdk/jdk1.8.0_151/lib:/home/ubuntu/software/jdk/jdk1.8.0_151/jre/lib -Dapplication.home=/home/ubuntu/software/jdk/jdk1.8.0_151 -Xms8m
2. jstat(JVM Statistics Monitoring Tool)
功能: 监视虚拟机各种运行状态信息,可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据
命令格式:
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所消耗的时间 |
-compiler | 输出JIT编译器编译过的方法和、耗时 |
-gc | 监视Java堆状况 |
-gccapacity | 监视内容与-gc基本相同,主要关注java堆各个区域使用到的最大、最小空间 |
-gccause | 与-gcutil功能相同,灰额外输出导致上一次GC产生的原因 |
-gcmetacapacity | 监视元空间 |
-gcnew | 监视新生代GC情况 |
-gcnewcapacity | 监视内容与-gcnew相同,输出主要关注使用到的最大、最小空间 |
-gcold | 监视老年代GC情况 |
-gcoldcapacity | 监视内容与-gcold相同,输出主要关注使用到的最大、最小空间 |
-gcutil | 监视内容与-gc基本相同,主要关注已使用空间占总空间的百分比 |
-printcompilation | 输出已经被JIT编译的方法 |
- -class
$ jstat -class 16420
# 加载的类数 大小(Kb) 卸载的类数 大小(Kb) 执行类加载和卸载操作花费的时间
Loaded Bytes Unloaded Bytes Time
15096 30199.4 3 4.6 15.34
- -gc
$ jstat -gc 16420
# 单位是KB
# survivor0容量 survivor1容量 survivor0使用 survivor1使用 Eden容量 Eden使用 OLD容量 OLD使用 元空间容量 元空间使用 压缩类空间容量 压缩类空间使用 年轻代GC数量 年轻代GC时间 Full GC数量 Full GC时间 GC总时间
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
29696.0 28160.0 560.5 0.0 1339904.0 124539.0 2796544.0 144642.9 99072.0 89527.5 12544.0 10189.7 42 0.550 5 0.566 1.116
- -gccapacity
$ jstat -gccapacity 16420
# 最小新生代容量 最大新生代容量 当前新生代容量 survivor0容量 survivor1容量 Eden容量 最小老年代容量 最大老年代容量 当前老年代容量 老年代空间容量 最小元空间容量 最大元空间容量 元空间大小 最小压缩类空间容量 最大压缩类空间容量 压缩类空间容量 年轻代GC数量 FUll GC数量
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
1397760.0 1397760.0 1397760.0 29696.0 28160.0 1339904.0 2796544.0 2796544.0 2796544.0 2796544.0 0.0 1136640.0 99072.0 0.0 1048576.0 12544.0 42 5
关于OGC和GC的区别:https://stackoverflow.com/questions/11253285/jstat-difference-between-ogc-oc-pgc-pc
OGC = sum(all OC),但是HotShot中old space只有一个
- -gcutil
$ jstat -gcutil 16420
# Survivor0使用比 Survivor0使用比 Eden使用比 OLD使用比 元空间使用比 压缩类使用比 年轻代GC数量
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
1.89 0.00 16.46 5.17 90.37 81.23 42 0.550 5 0.566 1.116
- -gccause
# jstat -gccause 16420
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
1.89 0.00 17.20 5.17 90.37 81.23 42 0.550 5 0.566 1.116 Allocation Failure No GC
- 持续监控
隔2秒监控一次堆使用情况,监测5次
$ jstat -gcutil 16420 2000 5
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
1.89 0.00 18.61 5.17 90.37 81.23 42 0.550 5 0.566 1.116
二、图形化监控工具
1. jconsole
3. jvisualvm
三、调试工具
1. jinfo
功能:实施查看和调整虚拟机参数
命令格式
jinfo [option] <pid>
参数:
-flag <name> 打印虚拟机参数的值
-flag [+|-]<name> 启用或关闭虚拟机参数
-flag <name>=<value> 设置虚拟机参数
-flags 打印虚拟机参数
- 查看指定参数的值
$ jinfo -flag InitialHeapSize 16420
-XX:InitialHeapSize=4294967296
- 查看虚拟机参数
jinfo -flags 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
Non-default VM flags: -XX:CICompilerCount=4 -XX:+HeapDumpOnOutOfMemoryError -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:MaxNewSize=1431306240 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=1431306240 -XX:OldSize=2863661056 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC
Command line: -Djava.util.logging.config.file=/home/jenkins/tomcat/jenkins/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -verbose:gc -XX:+PrintGCDetails -Xloggc:/tmp/gc.log -Xms4g -Xmx4g -XX:+HeapDumpOnOutOfMemoryError -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.69 -Dignore.endorsed.dirs= -Dcatalina.base=/home/jenkins/tomcat/jenkins -Dcatalina.home=/home/jenkins/tomcat/jenkins -Djava.io.tmpdir=/home/jenkins/tomcat/jenkins/temp
2. jmap
功能: 生成堆转储快照,查询finalize执行队列、Java堆详细信息、当前使用的那种收集器
主要选择
选择 | 作用 |
---|---|
-heap | 显示java堆信息,如使用哪种回收器、参数配置、分代情况 |
-histo | 显示堆中对象统计信息,包括类、实例数量、合计容量 |
-dump | 生成java堆转储快照 |
-clstats | 打印Java堆的类加载器的统计信息。对于每个类加载器,它的名称,它的活动程度,地址,父类加载器以及它加载的类的数量和大小都会被打印出来。 |
-finalizerinfo | 打印有关正在等待最终确定的对象的信息 |
-F | 当虚拟机进程没有响应时强制生成dump快照 |
- 打印java堆信息
# 须以root用户执行
$ jmap -J-d64 -heap 16420
Attaching to process ID 16420, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.151-b12
using thread-local object allocation.
Parallel GC with 8 thread(s) # 垃圾收集器
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 4294967296 (4096.0MB)
NewSize = 1431306240 (1365.0MB)
MaxNewSize = 1431306240 (1365.0MB)
OldSize = 2863661056 (2731.0MB)
NewRatio = 2 # 老年代占据堆的2/3,新生代占据1/3
SurvivorRatio = 8 # Survivor:Eden=1:8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space: # Eden区内存分布
capacity = 1378353152 (1314.5MB)
used = 74006280 (70.57788848876953MB)
free = 1304346872 (1243.9221115112305MB)
5.36918132284287% used
From Space: # 其中一个Survivor区的内存分布
capacity = 27262976 (26.0MB)
used = 0 (0.0MB)
free = 27262976 (26.0MB)
0.0% used
To Space: # 另一个Survivor区的内存分布
capacity = 25690112 (24.5MB)
used = 0 (0.0MB)
free = 25690112 (24.5MB)
0.0% used
PS Old Generation
capacity = 2863661056 (2731.0MB)
used = 60243072 (57.4522705078125MB)
free = 2803417984 (2673.5477294921875MB)
2.1037081841015195% used
38423 interned Strings occupying 4154104 bytes.
- 显示堆中对象统计信息
# 须以jvm启动用户执行该命令
$ jmap -histo:live 16420
num #instances #bytes class name
----------------------------------------------
1: 187022 22144672 [C
2: 185124 4442976 java.lang.String
3: 85170 2725440 java.util.HashMap$Node
4: 29978 2638064 java.lang.reflect.Method
5: 40422 2440632 [Ljava.lang.Object;
6: 6915 2123840 [B
7: 15533 1718560 java.lang.Class
... ... .... ...
6186: 1 16 sun.util.resources.LocaleData
6187: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl
6188: 1 16 websocket.drawboard.DrawboardContextListener
Total 1186181 62814680
- 转储堆快照
$ jmap -dump:live,format=b,file=jenkins.bin 16420
Dumping heap to /home/jenkins/jenkins.bin ...
$ ll jenkins.bin -h
-rw------- 1 jenkins jenkins 1011M 2月 14 11:43 jenkins.bin
3. jhat
功能:分析jamp生成的堆转储快照,jhat内置了一个微型HTTP服务器,生成dump文件的分析结果后可以在浏览器查看。
一般不会在生产服务器上进行分析,非常耗CPU和内存,不常用
jhat jenkins.bin
Reading from jenkins.bin...
Dump file created Thu Feb 14 11:43:45 CST 2019
Snapshot read, resolving...
Resolving 12022774 objects...
Chasing references, expect 2404
dots
Eliminating duplicate references
Snapshot resolved.
Started HTTP server on port 7000
Server is ready.
使用浏览器访问http://ip:7000 查看分析结果
4.jstack
功能: 生成虚拟机当前时刻的线程快照(一般称为threaddump、javacore文件)
参数:
-l: 打印关于锁的信息
-m: 打印java和native frames 的信息
- 使用方法
$ jstack -l 16420 > jenkins.jstack
线程的几种状态:
状态 | 含义 |
---|---|
NEW | 未启动的,不会出现在dump中 |
RUNNABLE | 在虚拟机内执行的。运行中状态,可能里面还能看到locked字样,表面它获得了某把锁 |
BLOCKED | 受阻塞并等待监视器锁。被某个锁(synchronizers)給block住了。 |
WATING | 无限期等待另一个线程执行特定操作。等待某个condition或monitor发生,一般停留在park(), wait(), sleep(),join() 等语句里。 |
TIMED_WATING | 有时限的等待另一个线程的特定操作。和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。 |
TERMINATED | 已退出的。 |