springboot程序cpu负载异常排查
1、定位异常进程
top
ps -ef | grep java
2、定位进程内高 CPU 的线程
# 查看进程1234下的线程CPU占用(按P排序,找到线程TID,如1235)
top -Hp 1
# 将线程TID转换为16进制(jstack需要16进制线程ID)
printf "%x\n" 1
3、Java 线程栈 + 堆内存排查
通过 JDK 自带工具分析线程栈、堆内存,定位代码层面的问题(如死循环、定时任务、GC 异常、依赖包隐式任务等)。
# 导出进程1234的线程栈到文件
jstack 1234 > thread_dump.txt
# 查找16进制线程ID(如4d3)对应的栈信息
grep -A 20 "4d3" thread_dump.txt
| 异常特征 | 可能原因 |
|---|---|
| 线程状态为 RUNNABLE,且重复执行某段代码 | 死循环(如自定义定时任务、缓存刷新逻辑) |
| 线程状态为 GC task thread | GC 频繁(内存泄漏导致 Full GC) |
| 线程名包含 Timer/ScheduledExecutor | 未停止的定时任务(如框架 / 依赖自带的定时任务) |
| 线程名包含 Netty/HttpClient | 连接池 / 网络组件的心跳 / 重连逻辑 |
| 线程名包含 Finalizer/Reference Handler | 堆内存泄漏,对象析构耗时 |
4、排查 GC 异常
jstat -gcutil 1234 1000 10
# 输出字段说明:
# S0/S1: 幸存区使用率 E: 伊甸园区使用率 O: 老年代使用率
# YGC/YGT: Young GC次数/耗时 FGC/FGT: Full GC次数/耗时
# 导出堆内存快照(分析内存泄漏)
jmap -dump:format=b,file=heap_dump.hprof 1234
# 用MAT(Eclipse Memory Analyzer)或JVisualVM打开heap_dump.hprof,分析大对象/内存泄漏
GC 异常判断标准:
YGC 每秒多次,或 FGC 频繁(如几分钟一次);
老年代使用率(O)接近 100%,触发持续 Full GC;
内存泄漏特征:某类对象(如 HashMap、自定义缓存)实例数持续增长,无法回收。

浙公网安备 33010602011771号