温馨提示×

ubuntu java线程卡顿原因

小樊
38
2026-09-28 08:27:52
栏目: 编程语言

在 Ubuntu(Linux)环境下 Java 线程卡顿,通常不是单一原因,而是CPU、内存、IO、锁、GC、系统配置等多方面叠加。下面按最常见 → 较少见系统梳理。


一、CPU 相关(最常见)

1. CPU 被占满

  • 现象:线程响应慢、吞吐量下降
  • 原因:
    • 死循环
    • 高频计算(加密、压缩、序列化)
    • 线程数过多,上下文切换频繁

排查:

top
htop
pidstat -p <pid> 1

Java 层:

jstack <pid>

看线程是否在 RUNNABLE 且长期占用 CPU


2. 上下文切换过多

  • 线程数 ≫ CPU 核数
  • 频繁 yield / sleep

查看:

vmstat 1
cat /proc/interrupts

二、锁 & 并发问题(非常常见)

3. 锁竞争(synchronized / ReentrantLock)

  • 现象:线程大量 BLOCKED
  • 原因:
    • 锁粒度太大
    • 热点数据竞争
jstack <pid> | grep -A 20 BLOCKED

4. 死锁 / 活锁

  • 线程互相等待
  • 活锁:一直重试但无进展
jstack <pid> | grep -i deadlock

三、GC 导致线程停顿(容易被忽略)

5. Full GC / Stop-The-World

  • 现象:所有线程“瞬间卡住”
  • 原因:
    • 堆内存不足
    • 大对象
    • GC 参数不合理

查看:

jstat -gcutil <pid> 1000

建议:

  • 使用 G1 / ZGC
  • 增大堆
  • 避免频繁创建对象

四、IO 阻塞(磁盘 / 网络)

6. 磁盘 IO 慢

  • 日志同步写
  • 数据库慢查询
  • NFS 挂载卡顿
iostat -x 1
dmesg | tail

7. 网络阻塞

  • 外部接口超时
  • 数据库连接池耗尽
  • 线程在 WAITING 等响应
netstat -anp | grep java
ss -tanp

五、系统 & 内核限制(Ubuntu 特有常见坑)

8. 文件描述符不足

  • 现象:连接建立不了、线程卡在 accept
ulimit -n
cat /proc/<pid>/limits

修改:

/etc/security/limits.conf

9. 线程数限制

  • 用户线程数上限
ulimit -u

10. swap 导致卡顿(非常隐蔽)

  • 内存不足 → swap
  • Java 对 swap 极度敏感
free -h
swapon --show

建议:

vm.swappiness=10

六、Ubuntu / JVM 环境配置问题

11. 使用了错误 JVM

  • 32 位 JVM
  • 老旧 JDK
java -version

12. NUMA / CPU 亲和性问题

  • 多 CPU 服务器未绑定
numactl --hardware

七、快速定位思路(推荐)

  1. top → 看 CPU / 内存
  2. jstack → 看线程状态
  3. jstat -gc → 看 GC
  4. iostat / netstat → 看 IO
  5. ulimit → 看系统限制

八、你可以补充的信息(我可以直接定位)

如果方便,告诉我:

  • JDK 版本
  • Ubuntu 版本
  • 线程数 / 并发量
  • 是否 Web / 微服务 / 批处理
  • jstack 或 top 截图

我可以直接帮你判断是哪一类卡顿。

0 踩