线上 JVM 出问题

标准线上 JVM 问题排查流程(完整版)

1. 定位问题进程

  • top 看系统负载、CPU、内存占用最高的进程

  • jps -l 精确拿到 Java 进程 PID

    2. 快速判断问题类型

  • CPU 飙高

  • 内存溢出 / GC 频繁 / OOM

  • 线程死锁、阻塞、夯死

  • 接口慢、响应超时

CPU 占用过高

  1. top -Hp <pid> 找到耗 CPU 的线程 PID
  2. 转 16 进制:printf "%x\n" <tid>
  3. jstack <pid> | grep <16进制tid> -A 20定位到具体代码行、死循环、频繁 GC、频繁锁竞争。

场景:Java 服务 CPU 飙到 300%

你运行:

top

看到:

PID USER %CPU COMMAND

12345 app 300 java

👉 确认是 Java 进程 12345 占用高 CPU


🔍 第一步:找"哪个线程"在烧 CPU

top -Hp 12345

输出类似:

PID USER %CPU COMMAND

12345 app 300 java

12380 app 98 java

12381 app 97 java

12382 app 0.3 java

👉 重点看高 CPU 的线程:

  • 12380
  • 12381

🔢 第二步:线程 ID 转 16 进制

复制代码

printf "%x\n" 12380

得到:

305c

再转另一个:

printf "%x\n" 12381

305d


🧵 第三步:用 jstack 定位代码

jstack 12345 | grep 305c -A 20

你会看到类似:

"pool-3-thread-1" #45 prio=5 os_prio=0 tid=0x00007f... nid=0x305c runnable

java.lang.Thread.State: RUNNABLE

at com.example.demo.TestService.loop(TestService.java:42)

at com.example.demo.TestService.run(TestService.java:30)


🎯 结论:问题代码

复制代码
public void loop() {
while (true) {
// 没有任何阻塞、sleep、IO
}
}

👉 这是典型的:

❌ 死循环导致 CPU 100%


🧠 再给你几个"真实常见案例"

⚠️ 案例 1:死循环(最常见)

while (true) {

if (queue.isEmpty()) {

continue; // ❌ 空转

}

}

👉 现象:

  • CPU 飙高
  • jstack 显示 RUNNABLE
  • 一直停在同一行

⚠️ 案例 2:频繁 GC

jstack 可能看到:

"GC task thread#0"

或者:

java.lang.Thread.State: RUNNABLE

at java.util.Arrays.copyOf(...)

👉 特征:

  • CPU 高
  • GC 日志频繁

👉 验证:

jstat -gcutil 12345 1000


⚠️ 案例 3:锁竞争(自旋)

java.lang.Thread.State: RUNNABLE

at java.util.concurrent.locks.ReentrantLock$NonfairSync.tryAcquire

👉 说明:

  • 多线程抢锁
  • 没阻塞,疯狂自旋 → CPU 高

⚠️ 案例 4:JSON / 加密 / 正则性能问题

at com.fasterxml.jackson.databind.ObjectMapper.writeValueAsString

或:

at java.util.regex.Pattern.match

👉 特点:

  • CPU 高
  • 不一定是死循环
  • 是"计算密集型热点"

🔥 一句话总结这套流程

👉 本质就是:

复制代码

进程 → 线程 → 线程栈 → 代码行

具体步骤:

  1. top → 找进程
  2. top -Hp → 找线程
  3. printf → 转 16 进制
  4. jstack → 找代码

✅ 实战小技巧(很重要)

  • 多抓几次 jstack(间隔 1-2 秒)

jstack 12345 > dump1.txt

sleep 2

jstack 12345 > dump2.txt

👉 如果一直卡在同一行 → 基本就是问题点

相关推荐
不会调制解调的猫2 小时前
笔记 | 什么是 rp_filter(反向路径过滤)?
服务器·网络·笔记
Splashtop高性能远程控制软件2 小时前
聊天工具与专业远程支持软件:企业 IT 远程支持工具选型的五个评估维度
运维·远程工作·splashtop
运维大师2 小时前
【安全与故障排查】07-混沌工程落地:用故障注入提升系统韧性
运维
小猿备忘录3 小时前
JVM 调优完全手册(Java 8 版)
java·开发语言·jvm
网络小白不怕黑3 小时前
10.邮件服务器搭建并脚本实现监控httpd状态
linux·运维·服务器
TTBIGDATA4 小时前
【Ambari Plus】15.Livy 安装
大数据·运维·hadoop·ambari·hdp·cdh·bigtop
CN_HW4 小时前
Nginx 流量镜像配置文档-双轨国产化
服务器·前端·网络
java_logo4 小时前
5 分钟共享打印机:用 Docker 一键部署 CUPS
运维·docker·容器·cups·网络打印机·共享打印机·docker部署cups
Macbethad4 小时前
基于TwinCAT的半导体刻蚀设备SCADA管理程序技术方案
运维·网络·数据库
KobeSacre5 小时前
CyclicBarrier 源码
java·jvm·算法