背景
线上机器cpu占用率一直为100%,对照功能和对应代码大致能猜测出是因为程序处理超大文本时采用了递归导致的。接下来我们借用 jstack 打印堆栈信息用以佐证。
jstack打印堆栈信息
- 执行 top 找出占用cpu最高的java进程id //10
- 执行 top -Hp pid 找出该进程内最耗费CPU的线程 //执行 top -Hp 10 得到167
- 执行 printf “%x\n” pid 得到对应线程id对应的十六进制值 //a7
- 执行 jstack [进程id]|grep -A 50 [线程的16进制值] 打印出问题的堆栈信息的后50行 //执行jstack 10 | grep -A 50 a7
简单执行这几步就可以查看程序出问题的堆栈信息了,也印证了最初的猜想。
如果你程序用的是 OpenJDK 的话,当你执行 jstack 时就会神奇的发现,系统不支持这个命令。本人就是如此的悲催碰到了。
OpenJDK 更新支持 jstack 命令
众所周知,并不是所有版本的 OpenJDK 都支持 jstack 命令的,有的甚至 javac 都不支持,这时候我们就需要更新一下来使用 jstack 了。
- 执行 java -version 查看jdk版本信息
- 执行 yum whatprovides ‘*/jmap’ 查看openJDK有jmap的yum源
- 选择合适自己的带有 devel 的版本进行更新,例如本人的选用如下红字的版本:
1: java-1.8.0-openjdk-devel-1.8.0.242.b08-1.el7.x86_64 : OpenJDK Development Environment 8
Repo : @base
Matched from:
Filename : /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-1.el7.x86_64/bin/jmap - 执行 yum install java-1.8.0-openjdk-devel-1.8.0.242.b08-1.el7.x86_64 更新指定的jdk,更新哪个版本视自己的情况
- 再次执行 jstack 命令,可执行即为成功。