cpu高占用,程序无响应。
top -Hp pid (shift+p 按cpu排序,shift+m 按内存排序)
根据当时情况,发现有四个线程CPU占用率一直高占。假设当前占用最高的线程ID是9899
转换成对应的16进制PID (PID为上一步中获取到的线程号)
printf '%x\n' PID
然后使用jstack 获取对应的线程信息
jstack 进程pid | grep -A 20 '0x7d0',查找nid匹配的线程,查看堆栈,定位引起高cpu的原因
导出jstack 线程内容
jstack -l 进程pid
这时候可以根据打印出来的线程信息,来判断程序发生了什么异常。
jmap -dump:format=b,file=dumpFileName pid
举例(pid是进程的pid)
jmap -dump:format=b,file=/tmp/20191110.dat 30193
可以在网上下载一个专业分析jvm内存的工具,如mat来进行分析,找出异常的内存占用对象后,再看代码进行下一步分析。
jstack -l
查看堆的大小,old区和young区的使用情况
jmap -histo:live 进程pid | more
使用jmap,查看当前堆的大对象
jmap -histo:live 进程pid | more