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、自定义缓存)实例数持续增长,无法回收。










posted @ 2026-01-04 17:41  Robots2  阅读(8)  评论(0)    收藏  举报