Java程序所在机器CPU升高排查原因

87 阅读1分钟

排查思路

定位到占用CPU最高的程序后进行相应处理

具体步骤

  1. 执行top命令,使用shift+p 筛查CPU占用率最高的项目,获取到其进程号

image.png

  1. 执行top -Hp 进程号命令,获取该进程下所有线程占用CPU的情况,获取到线程号

image.png

  1. 执行printf "%x\n" 线程号命令,获取十六进制的线程号。因使用jstack的线程展示使用的十六进制,所以将线程号转换来定位线程名称

image.png

  1. 执行jstack 进程号 | grep -A 20 线程号命令,获取该线程的状态

image.png

  1. 通过栈信息和业务代码关联排查

image.png

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=${目录}