问题排查-jvm命令
常用命令
jps
jps # 显示进程的ID 和 类的名称
jps –l # 输出输出完全的包名,应用主类名,jar的完全路径名
jps –v # 输出jvm参数
jps –q # 显示java进程号
jps -m # main 方法
jps -l xxx.xxx.xx.xx # 远程查看
jinfo
# 输出当前 jvm 进程的全部参数和系统属性
jinfo 2815
# 输出所有的参数
jinfo -flags 2815
# 查看指定的 jvm 参数的值
jinfo -flag PrintGC 2815
# 开启/关闭指定的JVM参数
jinfo -flag +PrintGC 2815
# 设置flag的参数
jinfo -flag name=value 2815
# 输出当前 jvm 进行的全部的系统属性
jinfo -sysprops 2815
实时查看和调整JVM配置参数:jinfo -flag name PID 查看某个java进程的name属性的值
jstat
查看类装载信息
jstat -class PID 1000 10 查看某个java进程的类装载信息,每1000毫秒输出一次,共输出10次
查看垃圾收集信息
jstat -gc PID 1000 10
jstack
# 基本
jstack 2815
# java和native c/c++框架的所有栈信息
jstack -m 2815
# 额外的锁信息列表,查看是否死锁
jstack -l 2815
-l 长列表. 打印关于锁的附加信息,例如属于java.util.concurrent 的 ownable synchronizers列表.
-F 当’jstack [-l] pid’没有相应的时候强制打印栈信息
-m 打印java和native c/c++框架的所有栈信息.
-h | -help 打印帮助信息
排查死锁案例
jstack找出占用cpu最高的线程堆栈信息
1、使用命令top -p 显示你的java进程的内存情况,pid是你的java进程号,比如19663
2、按H,获取每个线程的内存情况
3、找到内存和cpu占用最高的线程tid,比如19664
4、转为十六进制得到0x4cd0,此为线程id的十六进制表示
5、执行 jstack 19663|grep -A 10 4cd0
,得到线程堆栈信息中 4cd0 这个线程所在行的后面10行,
6、从堆栈中可以发现导致cpu飙高的调用方法,查看对应的堆栈信息找出可能存在问题的代码
jmap
# 查看堆的情况
jmap -heap 2815
# dump
jmap -dump:live,format=b,file=/tmp/heap2.bin 2815
jmap -dump:format=b,file=/tmp/heap3.bin 2815
# 查看堆的占用
jmap -histo 2815 | head -10
打印出堆内存相关信息
jmap -heap PID
dump出堆内存相关信息
jmap -dump:format=b,file=heap.hprof PID
一般在开发中,JVM参数可以加上下面两句,这样内存溢出时,会自动dump出该文件
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
可以用jvisualvm命令工具导入该dump文件分析。