JVM性能调优工具

常见命令行命令

jps

jps主要用于输出JVM中运行的进程状态信息

1
2
3
4
5
6
jps [options] [hostid]
# [hostid]:不指定hostid默认当前主机或服务器
# [options]: -q:不输出类名、Jar名和传人main方法的参数
# -m:输出传人main方法的参数
# -l:输出main类或Jar的全限名
# -v:输出传人JVM的参数

jstack

jstack主要查看某个Java进程内的线程堆栈信息

1
2
3
4
5
6
7
8
9
10
11
12
13
jstack [option] <PID>
# [options]:-l 打印额外的锁信息 jstack -l pid
# :-m 输出堆栈信息
# 首先找到进程ID
top -H
# 查看线程信息
ps -mp <PID> -o THREAD,tid,time
# ps -Lfp <PID>
# top -Hp <PID>
# 打印出16进制的线程ID
printf "%x\n" <TID>
# 输出进程的堆栈信息(此处TID为16进制)
jstack <PID> | grep <TID>

jmap

jmap 查看堆内存使用情况

1
2
3
4
5
jmap [option] <PID>
# 当运行在64位的jvm上:jmap -permstat pid
# [options]:-heap 进程堆内存的使用情况(GC算法、堆配置参数和各种中堆内存使用情况)
# -dump dump文件离线分析 jmap -heap:format=b,file=/tmp/dump.dat <PID>
# dump文件可以通过jhat或者可视化工具visualVM等工具查看

jstat

1
2
jstat -gc <PID> 10000 4
# 输出gc信息,采样时间间隔10000ms,采样数为4

实战问题

CPU飙高

1
2
3
4
5
6
7
8
# 查看所有的进程信息
top -H
# 查看指定进程的线程信息
ps -mp <PID> -o THREAD,tid,time
# 将10进制线程号转为16进制
printf "%x\n" <TID>
# 拉取堆栈信息
jstack <PID> | grep <TID*>

OOM问题

1
2
3
4
5
6
7
8
9
10
11
12
# 寻找java进程
jps
# 查看gc信息(1秒钟查询4次)
jstat -gc <PID> 1000 4
# 安装并运行arthas
curl -O https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar
# 打卡监控仪表盘
dashboard
# 堆转储
heapdump /tmp/dump-1.hprof
# 使用 visualvm 离线分析