jdk自带工具
- jps
- jmap
- jhat
- jstat
- 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

说明:
参数 | 说明 |
---|---|
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线程栈信息,根据根据堆栈信息定位到具体代码,可以分析死锁问题。
下面举例查询出最耗时线程,并分析耗时原因,分三个步骤:
- 定位最耗时的线程
top -Hp 12814

- 将线程ID转换为16进制(方便第3步查询)
printf '%x\n' 20843
516b
- 根据第2步得到的16进制的线程号查找线程
jstack 12814 | grep 516b
"taskExecutor-143" #778 prio=5 os_prio=0 tid=0x00007fd13cbf2000 nid=0x516b waiting for monitor entry [0x00007fd098ba4000]
分析出taskExecutor正在等待锁,进一步定位代码分析。
网友评论