线上环境的 JAVA 程序占用太多 CPU 资源,定位原因
top
命令执行显示一下结果
我们可以看到有一个 PID 是 4054 的应用程占用了超过一半的 CPU 资源,这是十分糟糕的事情,这个时候我们首先定位一下他是哪个线程在这里搞事情,这个时候使用命令 top -Hp 4054
哦,天,这是很糟糕的事情,我们看到这个 TID -> 6946 占用的 CPU 资源竟然已经超过其他的总和,这,这只能看看他到底在搞什么花样。想要查询一个线程在运行的时候他的堆栈信息,他已经部署到 linux
环境了,这个时候我可以想到两个方式一个是 arthas
,一个是使用 jdk
自带的工具类 jstack
jstack
jstack
的使用是十分简单的这个在这里使用并不会要下载其他额外的工具。这里我们就展示一下如何使用 jstack
把 TID 转换为 16 进制
这个是必须的,因为通过 jdk 命令 jstack 只能识别 16 进制的 TID,因为我们得到的 TID 是 10 进制,所以需要先转换为 16 进制,直接使用 shell 命令 printf "0x%x\n" 6946
这里可以得到以下的执行结果
这里我们得到结果为 -> 0x1b22,现在可以使用 jstack
来查询对应的堆栈信息了
根据 TID 的 16 禁止数字查询到对应的堆栈信息
# 得到 4054 的堆栈信息到文件 4054_stack
jstack 4054 > 4054_stack.log
vim 4054_stack.log
vim 编辑器进入以后我们可以直接搜索刚刚得到的 16 禁止的数字,就可以准确的找到相应的线程,我这里就不贴图查询的结果了,接下来就是从这段堆栈信息中分析出到底是那一段代码,然后再去代码中寻求解决方案。