几分钟搞定 Java 程序 CPU 飙升场景
一直想部署 Java 环境测试一下 CPU 或内存飙升场景,实操问题定位。自己如果部署虚拟机+安装 Linux 环境+配置 java 环境,太费劲了。幸好有 Docker 容器技术,装一个 docker desktop,直接下载所需镜像,及省劲又快捷。
准备
配置好 JDK 的 Linux 运行时环境;
一段 Bug 代码使 CPU 飙升;
查找问题的解决方案。
下载镜像
下载 JDK8 的 Linux 容器镜像环境
查看是否下载完成
启动镜像
由于是一个比较纯净的镜像,没有 vim 等指令,所以我们将本地 Bug 代码 mount 到镜像中,可以很方便的进行测试。启动镜像并将/Users/xxx/workspaceforjava
本地路径 mount 到镜像中/root/workspaceforjava
下,/Users/xxx/workspaceforjava`中的本地文件就可以在镜像的/root/workspaceforjava 下看到。
进入镜像中。
Bug 代码
一段死锁代码
存放在/Users/xxx/workspaceforjava/dome/demo-start/src/main/com/example/demo/DemoApplication 下,也可以不按照这么放置,但在执行时需要带上 package 包名路径,如下面的指令。
编译并执行代码
定位查询操作
通过top
命令,可以看到 PID 为 71 的进程 CPU 使用率达到 98.9%。
使用top -H -n 1 -p 71
可以看到,PID 为 84 和 85 的占用 CPU 比较高。
使用jstack -l 71 > ./jstack.log
将 jstack 信息打印到 jstack.log 中。将 10 进制的 85 转化为 16 进制后为 55,通过 cat 和 grep 打印出包括 54 的后 10 行信息。
这样就定位到问题代码,方便下一步优化解决。
参考:
版权声明: 本文为 InfoQ 作者【HelloGeek】的原创文章。
原文链接:【http://xie.infoq.cn/article/1fe969614fed43019c4fcd193】。文章转载请联系作者。
评论