1、jps:虚拟机进程状况工具
功能:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(Local Virtual Machine Identifier,LVMID)。
jps命令格式:
jps [options] [hostid]
hostid 选项:jps可以通过RMI协议查询开启了RMI服务的远程虚拟机进程状态,hostid为RMI注册表中注册的主机名。
options 常用选项:
-m:输出虚拟机进程启动时传递给主类main()函数的参数。
-l:输出主类的全名,如果进程执行的是Jar包,输出Jar路径。
-v:输出虚拟机进程启动时JVM参数。
示例:
jps -m:输出虚拟机进程启动时传递给主类main()函数的参数。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jps -m
9954 Jps -m
13780 Bootstrap start
其中,13780是虚拟机进程id,Bootstrap是主类的名称,start是传递给主类main()函数的参数。
jps -l:输出主类的全名,如果进程执行的是Jar包,输出Jar路径。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jps -l
9972 sun.tools.jps.Jps
13780 org.apache.catalina.startup.Bootstrap
其中,13780是虚拟机进程id,org.apache.catalina.startup.Bootstrap是主类全名。
jps -v:输出虚拟机进程启动时JVM参数。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jps -v
13780 Bootstrap -Djava.util.logging.config.file=/home/tomcat/apache-tomcat-8.5.30/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 -Dignore.endorsed.dirs= -Dcatalina.base=/home/tomcat/apache-tomcat-8.5.30 -Dcatalina.home=/home/tomcat/apache-tomcat-8.5.30 -Djava.io.tmpdir=/home/tomcat/apache-tomcat-8.5.30/temp
其中,13780是虚拟机进程id,Bootstrap是主类名称,-Djava之后是虚拟机进程启动时的JVM参数。
2、jstat:虚拟机统计信息监视工具
功能:用于监视虚拟机各种运行状态信息的命令行工具。
jstat命令格式:
jstat [option vmid [interval[s|ms] [count]]]
vmid :如果是本地虚拟机进程,VMID与LVMID是一致的,如果是远程虚拟机进程,那VMID的格式应当是:
[protocol:][//]lvmid[@hostname[:port]/servername]
interval 和 count:查询间隔和次数,如果省略这两个参数,说明只查询一次。
option 常用选项:
-class:监视类装载、卸载数量、总空间以及类装载所耗费的时间。
-gc:监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
-gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
-gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间。
示例:
jstat -class:监视类装载、卸载数量、总空间(KB)以及类装载所耗费的时间。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jstat -class 13780 1s 2
Loaded Bytes Unloaded Bytes Time
3725 7947.6 48 75.0 2.71
3725 7947.6 48 75.0 2.71
Loaded:类装载数量; Bytes:类装载所占空间大小; Unloaded:类卸载数量; 第二个Bytes:类卸载所占空间大小;Time:类装载所耗费时间;
jstat -gc:监视Java堆状况,包括Eden区、两个Survivor区、老年代、永久代等的容量、已用空间、GC时间合计等信息。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jstat -gc 13780
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
1280.0 1280.0 9.3 0.0 10368.0 6793.7 25844.0 16246.9 27648.0 26726.7 2816.0 2629.7 1184 2.942 2 0.097 3.039
S0C:第一个S区空间大小; S1C:第二个S区空间大小; S0U:第一个S区已使用空间大小; S1U:第二个S区已使用空间大小; EC:E区空间大小; EU:E区已使用空间大小; OC:老年代空间大小; OU:老年代已使用空间大小; MC:元空间(方法区)大小; MU:元空间已使用空间大小; CCSC:压缩类空间大小; CCSU:压缩类空间使用大小; YGC:Minor GC(年轻代垃圾回收)次数; YGCT:Minor GC(年轻代垃圾回收)消耗总时间; FGC:Full GC 次数; FGCT:Full GC 消耗总时间; GCT:所有GC消耗总时间。
说明:空间大小单位为KB;Minor GC表示年轻代垃圾回收,触发条件是当Eden区满时;Full GC表示整个GC堆的垃圾回收。
jstat -gcutil:监视内容与-gc基本相同,但输出主要关注已使用空间占总空间的百分比。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jstat -gcutil 13780
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
0.00 0.73 85.46 62.87 96.67 93.38 1185 2.944 2 0.097 3.041
jstat -gccapacity:监视内容与-gc基本相同,但输出主要关注Java堆各个区域使用到的最大、最小空间(KB)。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jstat -gccapacity 13780
NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC MCMN MCMX MC CCSMN CCSMX CCSC YGC FGC
10240.0 156992.0 12928.0 1280.0 1280.0 10368.0 20480.0 314048.0 25844.0 25844.0 0.0 1075200.0 27648.0 0.0 1048576.0 2816.0 1185 2
NGCMN:新生代最小容量; NGCMX:新生代最大容量; NGC:当前新生代容量; OGCMN:老年代最小容量; OGCMX:老年代最大容量; OGC:当前老年代容量; MCMN:元空间最小容量; MCMX:元空间最大容量; CCSMN:压缩类空间最小容量; CCSMX:压缩类空间最大容量;
3、jinfo:Java配置信息工具
功能:实时查看虚拟机各项参数。
jinfo命令格式:常用命令 jinfo -flags pid,其中pid为虚拟机进程id。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jinfo -flags 13780
Attaching to process ID 13780, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=31457280 -XX:MaxHeapSize=482344960 -XX:MaxNewSize=160759808 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=10485760 -XX:OldSize=20971520 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops
Command line: -Djava.util.logging.config.file=/home/tomcat/apache-tomcat-8.5.30/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 -Dignore.endorsed.dirs= -Dcatalina.base=/home/tomcat/apache-tomcat-8.5.30 -Dcatalina.home=/home/tomcat/apache-tomcat-8.5.30 -Djava.io.tmpdir=/home/tomcat/apache-tomcat-8.5.30/temp
4、jmap:Java内存映像工具
功能:用于生成堆转储快照(即dump文件),还可以查询finalize执行队列、Java堆和永久代的详细信息,如空间使用率、当前用的是哪种收集器等。
jmap命令格式:
jmap [option] vmid
option 常用选项:
-dump:生成Java堆转储快照。格式为 -dump:[live,]format=b,file=<filename>,其中live子参数说明是否只dump出存活的对象。
-heap:显示Java堆详细信息,如使用哪种回收器、参数配置、分代状况等。
示例:
jmap -dump:生成Java堆转储快照。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jmap -dump:format=b,file=eclipse.bin 13780
Dumping heap to /home/tomcat/eclipse.bin ...
Heap dump file created
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jmap -dump:live,format=b,file=eclipse2.bin 13780
Dumping heap to /home/tomcat/eclipse2.bin ...
Heap dump file created
jmap -heap:显示Java堆详细信息。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jmap -heap 13780
Attaching to process ID 13780, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.171-b11
using thread-local object allocation.
Mark Sweep Compact GC // 收集器类型
Heap Configuration: // 堆配置
MinHeapFreeRatio = 40 // 表示堆空余空间小于40%时,JVM就会增大堆直到-Xmx的最大限制
MaxHeapFreeRatio = 70 // 表示堆空余空间大于70%时,JVM就会减少堆直到-Xms的最小限制
MaxHeapSize = 482344960 (460.0MB) // 堆空间最大值
NewSize = 10485760 (10.0MB) // 新生代空间最小值
MaxNewSize = 160759808 (153.3125MB) // 新生代空间最大值
OldSize = 20971520 (20.0MB) // 老年代空间大小
NewRatio = 2 // 空间大小比值,新生代:老年代 = 1:2
SurvivorRatio = 8 // Eden区与2个Survivor区的空间大小比值,值为8表示1个Survivor占整个年轻代的1/10
MetaspaceSize = 21807104 (20.796875MB) // 元空间最小值,JDK8永久代被移除,方法区移至Metaspace(元空间)
CompressedClassSpaceSize = 1073741824 (1024.0MB) // 压缩类空间大小
MaxMetaspaceSize = 17592186044415 MB // 元空间最大值
G1HeapRegionSize = 0 (0.0MB) // G1堆在内存中是由n个不连续但大小相同的Region区域组成的,如果不设定,G1会根据Heap大小自动决定
Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 11927552 (11.375MB) // 容量
used = 621576 (0.5927810668945312MB)
free = 11305976 (10.782218933105469MB)
5.211262126545329% used
Eden Space:
capacity = 10616832 (10.125MB) // 容量
used = 621576 (0.5927810668945312MB)
free = 9995256 (9.532218933105469MB)
5.854627821180555% used
From Space:
capacity = 1310720 (1.25MB)
used = 0 (0.0MB)
free = 1310720 (1.25MB)
0.0% used
To Space:
capacity = 1310720 (1.25MB)
used = 0 (0.0MB)
free = 1310720 (1.25MB)
0.0% used
tenured generation: // 老年代
capacity = 26464256 (25.23828125MB)
used = 13658024 (13.025306701660156MB)
free = 12806232 (12.212974548339844MB)
51.60932542369602% used
13529 interned Strings occupying 1874112 bytes.
5、jstack:Java堆栈跟踪工具
功能:用于生成虚拟机当前时刻的线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等都是导致线程长时间停顿的常见原因。
jstack 命令格式:
jstack [option] vmid
option 常用选项:
-l:除堆栈外,显示关于锁的附加信息。
示例:
jstack -l:除堆栈外,显示关于锁的附加信息。
[tomcat@izbp1iei7rfo61p7l51fmgz ~]$ jstack -l 13780
2018-07-05 08:38:40
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode):
"Attach Listener" #65 daemon prio=9 os_prio=0 tid=0x00007f0d74001800 nid=0x7f0a waiting on condition [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
Locked ownable synchronizers:
- None
"ajp-nio-8009-exec-20" #64 daemon prio=5 os_prio=0 tid=0x0000000001f91000 nid=0x7fa0 waiting on condition [0x00007f0d785c2000]
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x00000000ed6eab28> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:103)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:31)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Locked ownable synchronizers:
- None
6、VisualVM:多合一故障处理可视化工具
功能:不仅实现了jps、jinfo、jstat、jmap、jstack等命令的功能,还有许多其他功能。
官方网站:http://visualvm.github.io/index.html
注:以上内容学习自《深入理解Java虚拟机:JVM高级特性与最佳实践》。