Junhc

岂止于博客

虚拟机性能监控与故障处理工具

目录
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-app
  • top -Hp <pid-app>命令找出线程 pid-thread
  • printf '%x\n' <pid-thread>命令将线程 pid 转换成 16 进制 pid-thread-hex
  • jstack <pid-app> | grep 'pid-thread-hex' 命令查看线程信息