OpenJDK利用jstack命令打印堆栈信息

背景

线上机器cpu占用率一直为100%,对照功能和对应代码大致能猜测出是因为程序处理超大文本时采用了递归导致的。接下来我们借用 jstack 打印堆栈信息用以佐证。

jstack打印堆栈信息

  1. 执行 top 找出占用cpu最高的java进程id //10
    top 命令
  2. 执行 top -Hp pid 找出该进程内最耗费CPU的线程 //执行 top -Hp 10 得到167
    执行 top -Hp 10
  3. 执行 printf “%x\n” pid 得到对应线程id对应的十六进制值 //a7
    转换对应16进制值
  4. 执行 jstack [进程id]|grep -A 50 [线程的16进制值] 打印出问题的堆栈信息的后50行 //执行jstack 10 | grep -A 50 a7
    打印堆栈信息印证猜想
    简单执行这几步就可以查看程序出问题的堆栈信息了,也印证了最初的猜想。
    如果你程序用的是 OpenJDK 的话,当你执行 jstack 时就会神奇的发现,系统不支持这个命令。本人就是如此的悲催碰到了。

OpenJDK 更新支持 jstack 命令

众所周知,并不是所有版本的 OpenJDK 都支持 jstack 命令的,有的甚至 javac 都不支持,这时候我们就需要更新一下来使用 jstack 了。

  1. 执行 java -version 查看jdk版本信息
    查看jdk版本
  2. 执行 yum whatprovides ‘*/jmap’ 查看openJDK有jmap的yum源
    在这里插入图片描述
  3. 选择合适自己的带有 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
  4. 执行 yum install java-1.8.0-openjdk-devel-1.8.0.242.b08-1.el7.x86_64 更新指定的jdk,更新哪个版本视自己的情况
  5. 再次执行 jstack 命令,可执行即为成功。
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值