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正在等待锁,进一步定位代码分析。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容