温馨提示×

debian tomcat为何占满CPU

小樊
37
2026-10-27 00:23:14
栏目: 智能运维

在 Debian 上 Tomcat 占满 CPU 通常不是 Tomcat 本身的问题,而是「运行在 Tomcat 上的应用 + 系统环境」导致的。下面按最常见原因 → 排查方法 → 解决思路给你一个系统性的说明。


一、最常见原因(按出现频率)

1️⃣ 应用代码死循环 / 高频逻辑

典型表现

  • CPU 100%(或接近)
  • 请求量不高也占满
  • 重启后一段时间又满

常见代码问题

  • while(true)、递归无退出
  • 定时任务(@Scheduled)执行过密
  • 正则回溯爆炸(复杂正则)
  • 序列化 / JSON 转换死循环(对象互相引用)

✅ 排查:

top
# 找到 tomcat/java 进程 PID
top -Hp PID
# 找到占用 CPU 的线程 ID(十进制)
printf "%x\n" 线程ID
# 转为 16 进制
jstack PID | grep 16进制线程 -A 30

可直接看到是哪行代码在跑


2️⃣ 内存不足 → 频繁 Full GC

典型表现

  • CPU 高但吞吐量低
  • 响应变慢
  • top 中 java 占 CPU,但业务线程不多

✅ 排查:

jstat -gcutil PID 1000

看:

  • FGC 很高
  • OU 接近 100%

✅ 解决:

  • 调大堆内存
JAVA_OPTS="-Xms2g -Xmx2g"
  • 修复内存泄漏(线程池、连接未关闭)

3️⃣ 请求风暴 / 爬虫 / 攻击

典型表现

  • 网络流量突然暴涨
  • CPU 和线程数同时上升

✅ 排查:

netstat -antp | grep java

或:

ss -ntup

✅ 解决:

  • Nginx 限流
  • 防火墙封 IP
  • 加验证码 / token

4️⃣ 日志写爆(log4j / logback)

典型表现

  • CPU 高但业务简单
  • 磁盘 IO 也高

✅ 解决:

  • 降低日志级别
  • 异步日志
  • 检查是否打印了大对象

5️⃣ Tomcat 配置不合理

典型问题

  • maxThreads 过大
  • acceptCount 不合理
  • 连接不释放

✅ 示例(server.xml):

<Connector
  port="8080"
  maxThreads="200"
  acceptCount="100"
  connectionTimeout="20000"
/>

6️⃣ Debian 系统层面问题

  • OpenJDK bug(少见)
  • 虚拟化 CPU 限制异常
  • 时钟源问题(KVM/Docker)

✅ 检查:

dmesg | tail
journalctl -xe

二、快速定位流程(强烈推荐)

top
top -Hp PID
jstack PID > thread.txt
jstat -gcutil PID 1000

三、你可以直接告诉我这些信息,我可以精准判断

  1. Tomcat 版本(8 / 9 / 10?)
  2. JDK 版本
  3. Debian 版本
  4. 是否 Docker
  5. CPU 是单核还是多核
  6. top / jstack 输出(可打码)

我可以帮你直接定位是哪一类问题,甚至哪段代码。

0 踩