排查思路
定位到占用CPU最高的程序后进行相应处理
具体步骤
- 执行
top命令,使用shift+p 筛查CPU占用率最高的项目,获取到其进程号
- 执行
top -Hp 进程号命令,获取该进程下所有线程占用CPU的情况,获取到线程号
- 执行
printf "%x\n" 线程号命令,获取十六进制的线程号。因使用jstack的线程展示使用的十六进制,所以将线程号转换来定位线程名称
- 执行
jstack 进程号 | grep -A 20 线程号命令,获取该线程的状态
- 通过栈信息和业务代码关联排查
tips:grep相关的命令
# 显示file文件中匹配foo字串那行以及上下5行
grep -C 5 foo file
# 显示foo及前5行
grep -B 5 foo file
# 显示foo及后5行
grep -A 5 foo file
tips:JVM监控常用命令
# 查看线程的运行状况,包括锁等待,线程是否在运行
jstack 进程号 | grep 线程号
# 查看整个JVM内存状态
jmap -heap 进程号
# 查看JVM堆中对象详细占用情况
jmap -histo 进程号
# 导出整个JVM 中内存信息
jmap -dump:format=b,file=文件名 进程号
# 查看JVM的GC信息
jstat -gc 进程号
# 表示当JVM发生OOM时,自动生成DUMP文件
-XX:+HeapDumpOnOutOfMemoryError
# 参数表示生成DUMP文件的路径,也可以指定文件名称
-XX:HeapDumpPath=${目录}