news 2026/4/3 5:02:52

生产环境 CPU 飙升 100%!别再去翻日志了,这 3 行命令教你 1 分钟定位代码行号

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
生产环境 CPU 飙升 100%!别再去翻日志了,这 3 行命令教你 1 分钟定位代码行号

01 报警突袭

下午 4 点,正是摸鱼的好时候,运维突然甩过来一张截图:“生产环境 03 号机器 CPU 飙升 100%,请求全堵了,快看一眼!”

我转头一看,旁边的实习生小弟已经慌了,正在疯狂敲 tail -f error.log,试图从日志里找原因。

我直接把他的手按住:“别瞎翻了!死循环是不写日志的!你就算把日志看穿了也找不到原因。”

很多兄弟有个误区,觉得出问题一定有报错。 其实 CPU 100% 和 内存溢出(OOM)不一样。 OOM 通常会有报错日志(OutOfMemoryError),但CPU 100% 通常是因为“死循环”或者“重度计算”。这时候程序是在“正常运行”的,它忙得连报错的时间都没有。

这时候,能救你的只有 Linux 原生命令。

来,看好了,给你演示一遍“3 分钟定位法”,学会了这招,下次报警你横着走。

02 第一板斧:找那个“显眼包”进程

连上服务器,别废话,直接敲:

top -c

(参数 -c 是为了看到具体的命令路径)

你会看到一个列表在跳动。盯着%CPU那一列。 通常排在第一位的,就是罪魁祸首。 记下它的PID(进程 ID),假设是18888。

这一步谁都会,关键是下一步。

03 第二板斧:扒出它的“作案”线程

找到了进程没用,一个 Java 进程里有几百个线程,到底是哪一个线程在搞鬼?

敲这个命令:

top -Hp 18888

(参数 -H 是显示线程,-p 是指定进程)

这时候,界面变了。里面列出的不再是进程,而是线程。 再一次,盯着%CPU那一列。 你会发现,有一个线程(或者几个)的 CPU 占用率特别高,甚至到了 99.9%。

记下这个线程的 ID(TID),假设是18900。

04 第三板斧:把 PID 转成 16 进制(关键!)

这一步是90% 的新手都会卡住的地方。 Linux 的 top 命令显示的 ID 是十进制的(18900)。 但 Java 的堆栈信息(jstack)里,线程 ID 是用十六进制(Hex)表示的(比如 0x49d4)。

所以,必须先转换一下。如果你心算不好,直接用命令:

printf "%x\n" 18900

输出结果:49d4。 好了,凶手的“指纹”拿到了。

05 终极绝杀:揪出那行代码

现在我们有了:

进程 ID:18888

线程 ID(16进制):49d4

直接祭出 Java 的核武器 ——jstack。

jstack 18888 | grep "49d4" -A 20

(解释:打印进程 18888 的堆栈,搜索 "49d4" 这个关键词,并显示后面 20 行)

回车一敲,真相大白!

你会看到类似这样的输出:

"Thread-5" #25 prio=5 os_prio=0 tid=0x00007f... nid=0x49d4 runnablejava.lang.Thread.State: RUNNABLEat com.company.order.service.CalcService.doLoop(CalcService.java:45)at com.company.order.service.CalcService.process(CalcService.java:20)

看见了吗?CalcService.java:45—— 第 45 行! 系统明确告诉你是这一行代码在狂跑(RUNNABLE 状态)。

打开代码一看,大概率是下面这种智障逻辑:

// 经典死循环while (true) {if (list.size() > 0) {// 处理逻辑...}// 没写 break,或者 list 永远不为空}

或者是HashMap 在多线程环境下扩容导致的死循环(JDK 1.7 的经典 Bug)。

06 别急,还有两个“坑”等着你(老鸟经验)

如果上面的步骤一切顺利,恭喜你。但在真实生产环境,你可能会遇到两个尴尬的情况:

坑一:权限不足(Permission Denied)

当你敲 jstack 时,系统提示你没权限,或者 Unable to open socket file。

原因:Java 进程可能是用 tomcat 用户启动的,而你用的是 root 或其他账号。

解法:切到对应用户执行,或者用 sudo:

sudo -u tomcat jstack 18888 | grep ...

坑二:抓出来的凶手叫 "GC task thread"

你费劲巴拉定位到了线程,结果 dump 出来一看,线程名叫"VM Thread"或者"GC task thread"。 这说明不是死循环,而是内存满了(OOM 前兆)! JVM 正在疯狂回收垃圾,但怎么回收都回收不掉,CPU 全被 GC 线程占用了。

解法:这时候别查代码逻辑了,赶紧去 dump 内存(jmap),查查是不是有大对象内存泄漏。

写在最后

兄弟们,生产事故不可怕,可怕的是面对黑框终端时的无助感。

把这套流程背下来:

top找进程。

top -Hp找线程。

printf转 16 进制。

jstack定位代码。

下次 CPU 再飙警报,别慌,冲杯咖啡,敲这 4 行命令,把 Bug 截图发给那个写死循环的同事,然后深藏功与名。

https://mp.weixin.qq.com/s/ENJE5onxT2ApYMw8ZH41zQ

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 15:26:26

Elasticsearch设置密码的正确方法:系统学习路径

以下是对您提供的博文《Elasticsearch 设置密码的正确方法:系统学习路径》进行 深度润色与专业重构后的终稿 。本次优化严格遵循您的全部要求: ✅ 彻底去除AI痕迹,语言自然、老练、有“人味”——像一位在大厂干了8年SRE、亲手部署过200+ES集群的工程师在技术博客里掏心窝…

作者头像 李华
网站建设 2026/3/31 14:16:35

NRF CONNECT零基础入门指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个NRF CONNECT学习应用,提供交互式教程和新手友好的界面。点击项目生成按钮,等待项目生成完整后预览效果 NRF CONNECT零基础入门指南 作为一个刚接触…

作者头像 李华
网站建设 2026/4/2 12:57:59

VaultCmd.exe文件丢失找不到 免费下载方法分享

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/3/31 10:56:14

学霸同款2026 9款一键生成论文工具测评:本科生毕业论文必备清单

学霸同款2026 9款一键生成论文工具测评:本科生毕业论文必备清单 2026年学术写作工具测评:为何需要这份榜单? 随着人工智能技术的不断进步,越来越多的本科生开始依赖AI工具来辅助毕业论文的撰写。然而,面对市场上琳琅满…

作者头像 李华