写点什么

Java 进程 CPU100% 打满分析

作者:落日楼台H
  • 2023-09-15
    浙江
  • 本文字数:853 字

    阅读完需:约 3 分钟

Java进程CPU100%打满分析

背景

最近发现测试服务器经常触发 CPU90%报警,这次有空了,决定上服务器分析一下,居然发现是最近新上线的日志收集服务消耗大量 CPU:

top 资源消耗分析, shift + p 根据 CPU 消耗排序,shift + m 根据内存消耗排序



一个进程 CPU 消耗超过 90%CPU,第一眼感觉不正常,因此进行了一番分析。

CPU 分析

1.使用 top -p <pid> 命令(<pid>为 Java 进程的 id 号)查看 Java 进程的 cpu 占用:

top -p 29595

查看指定进程资源使用情况



2.使用 top -Hp <pid> 命令(<pid>为 Java 进程的 id 号)查看该 Java 进程内所有线程的资源占用情况

top -Hp 29595

线程资源消耗分析, shift + p 根据 CPU 消耗排序,shift + m 根据内存消耗排序



3.终端上使用 printf "%x\n" <tid> 命令(tid 指线程的 id 号)将以上 10 进制的线程号转换为 16 进制

printf "%x\n" 29631 -> 73bf -> 及 0x73bf

16 进制进程号用于后面查询日志


4.使用 JDK 自带命令 jstack 获取此时的所有线程快照并输入到文件中

jstack -l <pid> > jstack.txt

命令(<pid>为 Java 进程的 id 号)来获取线程快照结果并输入到指定文件

jstack -l 29595 > jstack.txt


5.查看第 4 步生成的 txt 文件,搜索上述高 CPU 的 tid 信息 -> 0x73bf



在根据日志中的代码位置分析,进行代码优化


最后发现此处代码是一个死循环,一直在监测日志文件状态,并且无等待

额,原来是这里会产生长时间的循环空转,消耗大量 CPU



注: 业务上这里日志收集管理是持续检测日志目录,进行日志收集,包装日志收集的实时性和准确性


指导问题就好办,这里每一轮循环增加等待 1 秒,让出 CPU 资源。发布部署之后发现 CPU 顿时降下来了



修改后,CPU 消耗很低



总结

遇到 java 进程 CPU 占用较高级别就是这个分析思路:

  1. 确定高 CPU 进程的具体线程信息 top -Hp <pid>

  2. 通过命令输出当前各线程栈快照信息 jstack -l <pid> > jstack.txt

  3. 根据 16 进制线程 ID 在快照信息中查找定位具体代码

  4. 结合日志,调整优化代码,再次验证情况


完...

参考

https://www.cnblogs.com/dennyzhangdd/p/11585971.html

https://blog.csdn.net/chenfei3306/article/details/120125849

https://blog.csdn.net/lq0954/article/details/122862314


发布于: 刚刚阅读数: 6
用户头像

落日楼台H

关注

还未添加个人签名 2019-03-05 加入

还未添加个人简介

评论

发布
暂无评论
Java进程CPU100%打满分析_Java_落日楼台H_InfoQ写作社区