news 2026/4/9 14:07:04

生产环境 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/4/9 12:35:31

JS截屏内容粘贴到CKEDITOR如何通过PHP自动分类存储?

北京某集团公司项目需求实现记录:企业网站后台管理系统富文本编辑器增强功能开发 一、需求背景与核心目标 作为集团项目负责人,近期承接某政府客户企业网站后台管理系统升级需求,核心要求为: 功能增强:在CKEditor 4…

作者头像 李华
网站建设 2026/4/3 0:04:09

用HTML5实现Vue大文件秒传的DEMO?

北京XX软件公司涉密项目大文件传输解决方案(基于SM4国密算法的多数据库兼容方案) 一、项目背景与核心需求深化 作为服务政府及军工领域的软件企业,我司当前涉密项目需满足以下严苛要求: 多数据库兼容:需无缝适配达梦…

作者头像 李华
网站建设 2026/4/8 21:43:30

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

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

作者头像 李华
网站建设 2026/4/7 14:30:50

学霸同款2026继续教育AI论文写作软件TOP10:开题报告神器测评

学霸同款2026继续教育AI论文写作软件TOP10:开题报告神器测评 2026年继续教育AI论文写作软件测评:功能与效率的深度解析 随着人工智能技术在学术领域的广泛应用,AI论文写作工具逐渐成为科研人员和继续教育学员的重要辅助工具。然而&#xff0c…

作者头像 李华
网站建设 2026/4/8 5:26:51

【开题答辩全过程】以 基于Springboot的养老院管理系统的设计与实现为例,包含答辩的问题和答案

个人简介 一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等 开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。 感谢大家…

作者头像 李华
网站建设 2026/4/7 9:21:19

一天一个Python库:setuptools - 轻松构建和分发Python包

setuptools - 轻松构建和分发Python包 一、什么是setuptools? setuptools 是一个用于创建、分发和安装 Python 包的核心库。 它可以帮助你: 定义 Python 包的元数据(如名称、版本、作者等)。声明包的依赖项,确保你的包…

作者头像 李华