[转]Java CPU 100% 排查技巧
文章来源:微信公众号:猿天地
平时多积累一点,这样在遇到问题的时候就少句求人的话。如果在实际的开发中遇到CPU 100%问题,要怎么排查呢?如果你没有遇到过这个问题,请先自己思考10s,如果你遇到过,这个时候也正好可以在回顾一遍。
1. 使用top命令查看cpu占用资源较高的PID
当前占用cup100% 的PID为3455。
2. 通过jps找到当前用户下的java程序PID
执行jps -l能够打印出所有的应用的PID,找到有一个PID和这个cpu使用100%一样的ID。
这样就知道是哪一个项目服务存在问题了。知道了对应的服务,在接着后续的分析步骤。
3. 使用 pidstat命令查找问题线程
命令:pidstat -p < PID > 1 3 -u -t
-p:指定进程号
-u:默认的参数,显示各种进程的cup使用统计
-t:显示选择任务的线程的统计信息外的额外信息
4. 找到cpu占用较高的线程TID
通过上图发现是 3467的TID占用cup较大
5. 因为jstack命令输出文件记录的线程ID是16进制。
因此我们先将TID转换为十六进制的表示方式,转换命令:printf "%x\n" 3467
将3467转为十六进制 d8b,注意是小写,记录下来,后面会使用。
6. 通过jstack -l PID输出当前进程的线程信息
jstack -l PID /temp/test.log
这个命令是把pid的堆栈信息直接打印到/temp/test.log文件里。-l是非必填参数。
也可以直接搜索,命令:jstack PID | grep d8b
使用第二个命令会直接搜索到tid出现的信息,但缺少上下文不好定位。
7. 查找 TID对应的线程(输出的线程id为十六进制)
找到对应的代码,使用命令查找哦,不要肉眼比对,具体命令请思考,给你表现机会。
找到之后具体分析这个线程在干什么,为什么会占用这么多的 CUP资源。
PS:线程的几种状态如下说明:
NEW,未启动的。不会出现在Dump中。
RUNNABLE,在虚拟机内执行的。
BLOCKED,受阻塞并等待监视器锁。
WATING,无限期等待另一个线程执行特定操作。
TIMED_WATING,有时限的等待另一个线程的特定操作。
TERMINATED,已退出的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通