性能监控之基础故障处理工具
在JDK的bin目录中,有多种小工具,用来支持调试,监控,编译和运行等功能。
root@root:/usr/lib/jvm/java-8-openjdk-amd64/bin# ls appletviewer hsdb jarsigner javadoc java-rmi.cgi jdb jinfo jps jstack keytool pack200 rmid serialver unpack200 xjc clhsdb idlj java javah jcmd jdeps jjs jrunscript jstat native2ascii policytool rmiregistry servertool wsgen extcheck jar javac javap jconsole jhat jmap jsadebugd jstatd orbd rmic schemagen tnameserv wsimport
1.jps:虚拟机进程状况工具
可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID.Local Virtual Machine Identifier)
root@root:~$ jps -help usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]
root@root:/home/dev# jps -l
1505 *.jar
1507 *.jar
jps选项参数:
-q:只输出LVMID,省略主类的名称
-m:输出虚拟机进程启动时传递给主类main()函数的参数
-l:输出主类的全名,如果进程执行的是Jar包,则输出JAR路径
-v:输出虚拟机进程启动时的JVM参数
2.jmap:Java内存映像工具
用于生成堆转储快照.
Usage: jmap [option] <pid>
option:
-dump: 生成堆转储快照 -dump:[live,]format=b,file=<filename> <pid>
-heap: 显示java堆详细信息
root@dev03:/home/dev# jmap -dump:format=b,file=heapDump 30138
Dumping heap to /home/wuh151/heapDump ...
Heap dump file created
root@root:/home/dev# jmap -heap 30138
Attaching to process ID 30138, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.242-b08
using thread-local object allocation.
Parallel GC with 8 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0 ## 对应jvm启动参数-XX:MinHeapFreeRatio设置JVM堆最小空闲比率(default 40)
MaxHeapFreeRatio = 100 ## 对应jvm启动参数 -XX:MaxHeapFreeRatio设置JVM堆最大空闲比率(default 70)
MaxHeapSize = 1073741824 (1024.0MB) ## 对应jvm启动参数-XX:MaxHeapSize=设置JVM堆的最大大小
NewSize = 178782208 (170.5MB) ## 对应jvm启动参数-XX:NewSize=设置JVM堆的‘新生代’的默认大小
MaxNewSize = 357564416 (341.0MB) ## 对应jvm启动参数-XX:MaxNewSize=设置JVM堆的‘新生代’的最大大小
OldSize = 358088704 (341.5MB) ## 对应jvm启动参数-XX:OldSize=<value>:设置JVM堆的‘老生代’的大小
NewRatio = 2 ## 对应jvm启动参数-XX:NewRatio=:‘新生代’和‘老生代’的大小比率
SurvivorRatio = 8 ## 对应jvm启动参数-XX:SurvivorRatio=设置年轻代中Eden区与Survivor区的大小比值
MetaspaceSize = 1073741824 (1024.0MB)
CompressedClassSpaceSize = 268435456 (256.0MB)
MaxMetaspaceSize = 2147483648 (2048.0MB)
G1HeapRegionSize = 0 (0.0MB)
3.jstack:Java堆栈跟踪工具
用于生成虚拟机的当前时刻线程快照。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因。
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.144-b01 mixed mode): "com.alibaba.nacos.client.Worker.longPolling.fixed-nacos.lingda.com-dev-mofang" #92 daemon prio=5 os_prio=0 tid=0x000000001be17000 nid=0x3f64 waiting on condition [0x000000002a49f000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for <0x0000000081d75d48> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(Unknown Source) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source) at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.getTask(Unknown Source) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Locked ownable synchronizers: - None
统计线程使用数量:
root@dev03:/home/dev# jstack -l 2791 | grep 'java.lang.Thread.State' | wc -l 48
4.jstat:虚拟机统计信息监视工具
监视虚拟机的各种运行状态信息。
Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
参数interval count代表查询间隔和次数,如果参数省略,说明只查一次
option:
-class 监视类加载,卸载数量,总空间及类装载所耗费的时间
-gc 监视java堆状况
-gcutil 与-gc基本相同,输出主要关注已使用空间占总空间的百分比
...
root@root:/home/dev# jstat -gcutil 25791
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT
97.84 0.00 61.84 77.63 97.22 95.68 338 58.808 2 1.787 60.595
S0: 幸存0区当前使用比例
S1: 幸存1区当前使用比例
E: 伊甸区使用比例
O: 老年代使用比例
M: 元数据区使用比例
CCS: 压缩使用比例
YGC: 年轻代垃圾回收次数
YGCT:年轻代垃圾回收时间
FGC: 老年代垃圾回收次数
FGCT:老年代垃圾回收时间
GCT: 垃圾回收总时间