虚拟机性能监控与故障处理工具
目录
- jps: 虚拟机进程状况工具
- jstat: 虚拟机统计信息监视工具
- jinfo: Java配置信息工具
- jmap: Java内存映像工具
- jhat: 虚拟机堆转储快照分析工具
- jstack: Java堆栈跟踪工具
jps: 虚拟机进程状况工具
jps 命令格式
jps [ options ] [ hostid ]
选项 | 作用 |
---|---|
-q | 只输出LVMID, 省略主类的名称 |
-m | 输出虚拟机进程启动时传递给主类main()函数的参数 |
-l | 输出主类的全名, 如果进程执行的是Jar包, 输出Jar路径 |
-v | 输出虚拟机进程启动时JVM参数 |
jstat: 虚拟机统计信息监视工具
jstat 命令格式
jstat [ option vimd [[interval][s|ms] [count]] ]
如果是本地虚拟机进程, VMID与LVMID是一致的, 如果是远程虚拟机进程, 那VMID的格式是:
[protocol:][//][lvmid][@hostname[:port]/servername]
参数interval和count代表查询间隔和次数, 如果省略两个参数, 说明只查询一次.
选项 | 作用 |
---|---|
-class | 监视类装载、卸载数量、总空间以及类装载所消耗的时间 |
-gc | 监视Java堆状况, 包括Eden区、两个survivor区、老年代、永久代等的数量、已用空间、GC时间合计等信息 |
-gcutil | 监视内容与-gc基本相同, 但输出主要关注Java堆各个区域使用到的最大、最小空间 |
-gcnew | 监视新生代GC状况 |
-gcold | 监视老年代GC状况 |
-gcpermcapacity | 输出永久代使用到的最大、最小空间 |
jinfo: Java配置信息工具
jinfo 命令格式
jinfo [ option ] pid
jmap: Java内存映像工具
如果不使用jmap, 要想获取Java堆转储快照
-XX:+HeapDumpOnOutOfMemoryError
参数, 可以让虚拟机在OOM异常出现之后自动生成dump文件
-XX:+heapDumpOnCtrlBreak
参数, 则可以使用[Ctrl]+[Break]键让虚拟机生成dump文件
kill -3
命令发送进程退出信号 “吓唬” 一下虚拟机, 也能拿到dump文件
jmap 命令格式
jmap [ option ] vmid
选项 | 作用 |
---|---|
-dump | 生成Java堆转储快照. 格式为: -dump:[live, ]format=b, file=<filename> , 其中live子参数说明是否只dump出存活的对象 |
-finalizerinfo | 显示在F-Queue中等待Finalizer线程执行finalize方法的对象 |
-heap | 显示Java堆详细信息, 如使用哪种回收器、参数配置、分代状况等 |
-histo | 显示堆中对象统计信息, 包括类、实例数量、合计容量 |
-permstat | 以ClassLoader为统计口径显示永久代内存状态 |
-F | 当虚拟机进程对-dump选项没有响应式, 可使用这个选项强制生成dump快照 |
> jmap -dump:format=b,file=heap.dump 5041
> jmap -heap 20
Attaching to process ID 20, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.275-b01
using thread-local object allocation.
Parallel GC with 13 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 1572864000 (1500.0MB)
NewSize = 524288000 (500.0MB)
MaxNewSize = 524288000 (500.0MB)
OldSize = 1048576000 (1000.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 401604608 (383.0MB)
used = 89207272 (85.0746841430664MB)
free = 312397336 (297.9253158569336MB)
22.2127112645082% used
From Space:
capacity = 60293120 (57.5MB)
used = 1572864 (1.5MB)
free = 58720256 (56.0MB)
2.608695652173913% used
To Space:
capacity = 61341696 (58.5MB)
used = 0 (0.0MB)
free = 61341696 (58.5MB)
0.0% used
PS Old Generation
capacity = 1048576000 (1000.0MB)
used = 1003254400 (956.7779541015625MB)
free = 45321600 (43.2220458984375MB)
95.67779541015625% used
54352 interned Strings occupying 6236760 bytes.
jhat: 虚拟机堆转储快照分析工具
# jhat heapdump
...
Started HTTP server on port 700
Server is ready
更加专业的用于分析dump文件的工具: VisualVM、Eclipse Memory Analyzer、IBM HeapAnalyzer
jstack: Java堆栈跟踪工具
jstack命令用于生成虚拟机当前时刻的线程快照(threaddump). 线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合. 主要目的是定位线程出现长时间停顿的原因、如线程间死锁、死循环、请求外部资源导致的长时间等待等
jstack [ option ] vmid
选项 | 作用 |
---|---|
-F | 当正常输出的请求不被响应时, 强制输出线程堆栈 |
-l | 除堆栈外, 显示关于锁的附加信息 |
-m | 如果调用到本地方法的话, 可以显示C/C++的堆栈 |
> jstack 1429 > threaddump
> grep 'java.lang.Thread.State' threaddump | awk '{print $2$3$4$5}' | sort | uniq -c
8 RUNNABLE
1 TIMED_WAITING(onobjectmonitor)
21 TIMED_WAITING(parking)
4 TIMED_WAITING(sleeping)
4 WAITING(onobjectmonitor)
16 WAITING(parking)
查看占用CPU最高的线程
top
命令找出应用 pid-apptop -Hp <pid-app>
命令找出线程 pid-threadprintf '%x\n' <pid-thread>
命令将线程 pid 转换成 16 进制 pid-thread-hexjstack <pid-app> | grep 'pid-thread-hex'
命令查看线程信息