1. 线上Java应用CPU 100%问题排查指南
作为后端开发者,线上环境CPU占用率飙升到100%是个让人头疼的问题。服务器资源被吃满,轻则响应变慢,重则服务不可用。今天我就结合多年实战经验,分享两种行之有效的排查方案,帮你快速定位问题根源。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 方案一:JDK原生工具排查(零依赖)
2.1 定位高CPU的Java进程
首先我们需要确定是哪个Java进程在疯狂消耗CPU资源。在Linux环境下,最直接的方式就是使用top命令:
bash复制top
进入top界面后,按下大写P键(Shift+P),进程会按CPU使用率从高到低排序。找到%CPU接近100%的进程,记下它的PID(进程ID)。
注意:有些服务器上可能同时运行多个Java应用,务必确认找到的是目标应用的进程。
为了确认这个高CPU进程确实是我们的Java应用,可以运行:
bash复制jps -l
这个命令会列出当前所有Java进程的PID和主类名(或jar包路径)。通过对比PID,就能确认高CPU进程是否属于我们的应用。
2.2 定位进程内的高CPU线程
Java进程CPU高通常是由其中少数几个线程导致的。我们需要进一步缩小范围,找出具体的"罪魁祸首"线程:
bash复制top -Hp [进程PID]
这个命令会显示指定进程内所有线程的CPU使用情况。同样按P键排序,找到CPU占比最高的线程,记下它的LWP(线程ID,十进制)。
由于jstack输出的线程ID是16进制的,我们需要先做转换:
bash复制printf "%x\n" [线程LWP]
例如线程LWP是12345,转换后得到3039(16进制)。
2.3 分析线程堆栈定位问题代码
现在我们已经锁定了高CPU线程,接下来需要查看这个线程正在执行什么代码:
bash复制jstack [进程PID] > thread_dump.log
这个命令会导出Java进程的所有线程堆栈信息到thread_dump.log文件。用vim或其他文本编辑器打开这个文件,搜索我们之前转换得到的16进制线程ID:
bash复制vim thread_dump.log
在vim中,输入/3039(替换为你的1
