Tomcat 占内存高,通常不是“Tomcat 本身”问题,而是运行环境、配置和应用共同作用的结果。下面从常见原因到排查思路系统说明。
Tomcat 是跑在 JVM 上的,堆内存设置不当是头号原因。
-Xms 初始堆太小 → 频繁 GC-Xmx 设置过大 → 看起来“内存占用高”示例(常见问题):
-Xms512m -Xmx8g
✅ 建议:
-Xms2g -Xmx2g
-XX:MetaspaceSize=256m
-XX:MaxMetaspaceSize=512m
总结:
JVM 内存 ≠ Tomcat 内存,而大部分“内存高”其实是 JVM 的堆。
这是生产环境最常见的问题之一。
常见泄漏点:
✅ 表现:
Tomcat 默认线程模型:
maxThreads = 200高并发时:
200 线程 ≈ 200MB 栈内存
✅ 建议:
<Connector port="8080"
maxThreads="150"
minSpareThreads="20" />
常见于:
✅ 排查:
jstat -class pid
例如:
✅ 建议:
Linux 下常见误解:
top 看到的 RES 高✅ 正确方式:
jmap -heap pid
或:
ps -p pid -o vsz,rss
jstat -gc pid
关注:
OU(Old 区)MU(Metaspace)FGC(Full GC 次数)jmap -histo:live pid | head -20
常见“凶手”:
char[]StringHashMapbyte[]jstack pid
关注:
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-Xloggc:gc.log
| 场景 | 原因 |
|---|---|
| 启动就占 2G+ | JVM 堆设置过大 |
| 运行几天后 OOM | 内存泄漏 |
| 并发一高就卡 | 线程数 + GC |
| 热部署几次就炸 | Metaspace / ClassLoader |
| 数据一多就慢 | 缓存 / 大对象 |
✅ 不多
Tomcat 本身:
你可以贴出:
top 或 jstat 输出我可以直接帮你判断 是配置问题还是代码问题。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。