JVM性能监控与故障处理工具

列出正在运行的JVM进程

1
2
$jps -lm #查看LVMID及主类全路径及参数,为其他工具提供LVMID(Local Virtual Machine Identifier)
689620 sun.tools.jps.Jps -lm

如果是本地JVM,LVMID与进程ID(PID)相同,如果是远程JVM,则VMID格式是:

[protocol:][//]lvmid[@hostname[:port]]/servername]

监视JVM运行状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
$ jstat -class 19570 #监视类装载/卸载数量及时间
  Loaded  Bytes  Unloaded  Bytes     Time   
  36286 55328.9    27331 38443.1       8.05
$ jstat -gcutil 29915 10s 3 #监视JVM堆状态,[每10秒一次,共3次]。-gc显示容量,-gcutil显示百分比
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT   
  0.00  43.96  35.87  22.94  69.18   2671    4.498     0    0.000    4.498 
$ jmap -heap 29915 #列出当前使用的GC算法,堆的各个区域大小
Heap Configuration:
   MinHeapFreeRatio = 0
   MaxHeapFreeRatio = 100
   MaxHeapSize      = 4129292288 (3938.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)
   G1HeapRegionSize = 0 (0.0MB)

Heap Usage:
$ jmap -histo 29915 #按占大小倒序列出内存中的实例类型
 num     #instances         #bytes  class name
----------------------------------------------
   1:         48221        4361360  [C
   2:         28082        3826496  <constMethodKlass>

实时查看和修改JVM参数

1
2
3
4
5
6
7
8
9
$ jps -v #列出JVM启动参数
22102 Jps -Denv.class.path= -Dapplication.home=/jdk7 -Xms8m
$ jinfo 29915 #列出JVM启动参数和system.properties
Attaching to process ID 29915, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.80-b11
Java System Properties:
VM Flags:

生成堆转储快照(heap dump)

1
2
3
4
$ jmap -dump:live,format=b,file=/tmp/1.bin 29915 #格式为-dump:[live,]format=b,file=<filename>,其中live表示是否只dump出存活的对象
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=xxx  #设置JVM参数,当JVM OOM时输出堆的dump
-XX:+HeapDumpOnCtrlBreak #使用[Ctrl]+[Break]让JVM生成dump文件
$ ulimit -c unlimited #设置Linux ulimit参数,可以产生coredump且不受大小限制,如果JVM还没来得及heapdump就异常退出,就需要借助系统生成进程挂掉的core dump文件

线程快照(thread dump或javacore)

用于定位线程长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间等待等原因

1
$ jstack -l 29915

JFR(Java Flight Recorder)

1
2
3
运行jmc, Window->Flight Recording Template Manage菜单。准备好档案后,导出JFR配置文件
jcmd 8152 VM.unlock_commercial_features
jcmd <PID> JFR.start name=test duration=60s settings=template.jfc filename=output.jfr

可视化工具

jconsole

  • “内存”标签相当于可视化的jstat,用于监控JVM内存(堆和永久代)的变化趋势
  • “线程”标签相当于可视化的jstack,遇到线程停顿可以使用这个标签进行监控分析

jvisualvm

  • “线程”标签提供线程dump
  • “抽样器”标签提供cpu和堆dump
  • “profiler”标签提供方法级的CPU执行时间及内存分析,堆程序运行性能较大影响,在生产环境不建议使用
  • “BTrace”插件,通过HotSpot JVM的HotSwap技术运行在不停止运行的情况下动态更新已经加载的类代码,从而加入调试代码进行调试