Java CPU 飙高90% 都是业务代码死循环、频繁GC、密集计算、死锁/自旋导致的排查有标准、固定、可落地的流程不需要猜。下面给你一套从登录服务器到定位代码行的完整实战步骤直接照着做就能定位问题。一、快速定位哪个进程占用 CPU 最高1. 查看系统整体 CPU 占用top找到CPU 使用率最高的 Java 进程 PID第一列。二、精准定位这个进程里哪个线程在耗 CPU2. 查看该 Java 进程内的线程排行top-H-pPID会列出该 Java 进程内部所有线程找到CPU 最高的线程 TID。3. 把线程 TID 转成 16 进制JVM 栈用 16 进制标识线程printf%x\nTID得到一个16 进制线程 ID记下来后面要用。三、抓取线程栈找到耗 CPU 的代码4. 导出 Java 线程栈jstackPIDstack.log5. 在栈文件里搜索刚才的 16 进制线程 IDgrep-A2016进制TIDstack.log-A 20 表示显示后 20 行直接就能看到线程名称线程状态具体耗 CPU 的代码类、方法、行号四、最常见的 4 种 CPU 飙高原因一看栈就知道1. 死循环 / 无限递归最常见栈特征com.xxx.service.UserService.getUserList(UserService.java:88)代码一直卡在同一行没有阻塞一直在跑。2. 频繁 Full GC / Young GC栈特征VM Thread GC task thread排查命令jstat-gcPID100010如果FGCFullGC次数每秒涨好几次就是内存泄漏/GC 导致 CPU 高。3. 大量锁自旋 / CAS 空循环栈特征sun.misc.Unsafe.park java.util.concurrent.locks线程处于RUNNABLE 但一直在自旋。4. 密集计算加密、循环、正则、JSON 解析栈会停留在加密工具类复杂 for 循环正则表达式灾难性回溯JSON/XML 序列化五、1 分钟快速排查脚本直接复制用把下面内容保存为check_cpu.sh一键定位耗 CPU 代码行#!/bin/bashPID$1jstack$PIDstack.logTID$(top-b-n1-H-p$PID|grepjava|sort-nrk9|head-1|awk{print $1})HEX_TID$(printf%x\n$TID)echo高耗CPU线程16进制$HEX_TIDgrep-A30$HEX_TIDstack.log使用chmodx check_cpu.sh ./check_cpu.shJava进程PID六、定位到代码后怎么解决死循环检查循环条件、边界值、迭代逻辑频繁GC查内存泄漏用 jmap 堆 dump、调整堆大小锁自旋改用公平锁、减少锁竞争、异步化密集计算异步执行、分片、缓存结果、优化算法七、必备工具无需安装Linux JDK 自带生产环境直接用top看进程/线程 CPUjstack线程栈jstatGC 监控jmap堆内存 dump定位内存泄漏总结top找 Java 进程 PIDtop -H找耗 CPU 线程 TID转 16 进制jstack grep定位代码行按栈特征判断是死循环/GC/锁/密集计算整个流程不重启、不影响业务、1~3 分钟定位根因。