在 Java + Tomcat 的场景里,“Tomcat 很耗 CPU”通常不是 Tomcat 本身的问题,而是运行在 Tomcat 上的 Java 应用或配置导致的。下面按常见原因 → 排查思路来说明。
这是 CPU 飙高最常见原因。
典型情况:
while(true) 没有休眠示例:
while (true) {
// 没有 sleep,CPU 直接拉满
}
✅ 排查:
top -Hp <tomcat_pid>
找到高 CPU 的线程 ID → 转 16 进制 → jstack 看线程栈
GC 本身也会吃 CPU。
表现:
常见原因:
✅ 排查:
jstat -gcutil <pid> 1000
看:
FGC 频繁OU 接近 100%Tomcat 默认线程数并不低,并发一高就容易炸。
例如:
maxThreads=200结果:
✅ 查看:
jstack <pid> | grep "java.lang.Thread.State" | sort | uniq -c
多个线程抢同一把锁:
synchronizedReentrantLock表现:
BLOCKED✅ 看 jstack 里大量:
- waiting to lock <0x...>
你没看错,日志也能打爆 CPU。
例如:
DEBUG 级别✅ 优化:
CPU 会明显升高。
常见问题:
acceptCount 太大maxThreads 设置过高✅ 建议:
maxThreads=200
acceptCount=100
top
top -Hp <pid>
printf "%x\n" <thread_id>
jstack <pid> | grep -A 30 <hex_id>
jstat -gcutil <pid> 1000
jmap -histo <pid> | head
Tomcat 耗 CPU,99% 是 Java 代码或配置问题,不是 Tomcat 本身。
如果你愿意,可以把:
jstack / jstat 输出发出来,我可以直接帮你定位是哪一类问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。