jvm监控

jdk自带工具

  1. jps
  2. jmap
  3. jhat
  4. jstat
  5. jstack

可解决的问题

内存不足,线程死锁,锁竞争,线程栈溢出(死循环导致),服务卡顿(GC导致),CPU使用过高(可定位到具体线程)。

jps

Java Virtual Machine Process Status Tool,用于查看当前机器正在运行的java进程。
举例:

jps 
9093 Jps
12814 Bootstrap

jmap

查看jvm内存堆栈相关信息。

使用 说明 举例
-heap 查看内存堆栈概要信息 jmap -heap 12814
-histo[:live] 查看内存堆栈中的存活的类对象信息 jmap -histo:live 12814
-dump 输出内存堆栈使用信息到二进制文件。dump出来的文件可以用MAT、VisualVM等工具查看,也可以用jdk自带的jhat命令查看,可以查看内存中加载的类,以及对象数量大小等 jmap -dump:format=b,file=/tmp/dump.dat 12814

jhat

分析dump文件,并启动一个http server服务供查看。
例如:

jhat -port 9998 /tmp/dump.dat

再用浏览器访问jhat机器的9998端口,例如:http://localhost:9998

jstat

JVM统计监测工具,通过该工具可以实时了解当前进程的gc,compiler,class,memory等相关的情况,具体可通过jstat -options来看其支持的数据类型。
语法格式如下:

jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]

举例:

jstat -gc 12814 1000 6
image.png

说明:

参数 说明
S0C、S1C、S0U、S1U 新生代 0/1区的容量(Capacity)和使用量(Used),单位kb
EC、EU 新生代Eden区的容量(Capacity)和使用量(Used) ,单位kb
OC、OU 年老代Old区的容量(Capacity)和使用量(Used),单位kb
MC、MU Metaspace区的容量(Capacity)和使用量(Used),单位kb
CCSC、CCSU Compressed Class Space Capacity和使用量(Used),单位kb
YGC、YGCT yong gc次数和yong gc耗时(单位秒)
FGC、FGCT full gc次数和full gc耗时(单位秒)
GCT gc总耗时(单位秒)

gc日志分析

jstack

查看jvm线程栈信息,根据根据堆栈信息定位到具体代码,可以分析死锁问题。
下面举例查询出最耗时线程,并分析耗时原因,分三个步骤:

  1. 定位最耗时的线程
top -Hp 12814 
image.png
  1. 将线程ID转换为16进制(方便第3步查询)
printf '%x\n' 20843
516b
  1. 根据第2步得到的16进制的线程号查找线程
 jstack 12814 | grep 516b
"taskExecutor-143" #778 prio=5 os_prio=0 tid=0x00007fd13cbf2000 nid=0x516b waiting for monitor entry [0x00007fd098ba4000]

分析出taskExecutor正在等待锁,进一步定位代码分析。

你可能感兴趣的:(jvm监控)