tomcat性能取决于jvm内存参数与实际负载的匹配:-xms与-xmx需相等以避免stw;16gb物理内存推荐设为-xms8g -xmx8g、-xx:metaspacesize=256m -xx:maxmetaspacesize=512m;新生代建议占堆1/3(-xx:newratio=2),延迟敏感场景优选g1或zgc,并必须开启gc日志监控。

Tomcat部署后性能表现,很大程度上取决于JVM内存参数是否贴合实际负载。盲目增大堆内存反而可能延长GC停顿,而过小又容易触发频繁Full GC甚至OOM。关键不是“设多大”,而是让内存分配、回收节奏与应用行为匹配。
堆内存设置:Xms 与 Xmx 要相等
启动时就分配好所需堆空间,避免运行中动态扩容带来的STW(Stop-The-World)开销。生产环境推荐:
- 物理内存为16GB的服务器,堆内存设为8GB:-Xms8g -Xmx8g
- 元空间(Metaspace)设为初始256MB、上限512MB:-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
- 线程栈大小按并发量微调:高线程数场景可设为-Xss256k,普通Web应用保持默认(约1MB/线程)即可
新生代与老年代比例要合理
多数Web应用对象生命周期短,应适当扩大新生代,减少对象过早进入老年代。常用配置:
- -XX:NewRatio=2 表示老年代:新生代 = 2:1(即新生代占堆1/3)
- -XX:SurvivorRatio=8 表示Eden区与一个Survivor区的比例为8:1,两个Survivor共占新生代1/10
- 若Young GC频繁但晋升少,可尝试 -XX:NewRatio=1(新生代占1/2),配合G1回收器效果更稳
垃圾收集器选型要看业务特征
不建议沿用默认的Parallel GC做Web服务——它吞吐高但停顿不可控。根据响应要求选择:
- 对延迟敏感(如API网关、实时下单):用G1,加参数 -XX:+UseG1GC -XX:MaxGCPauseMillis=200
- 批处理或后台任务类应用:可用Parallel GC,-XX:+UseParallelGC -XX:ParallelGCThreads=4
- JDK 17+推荐ZGC(低延迟、可伸缩),需显式启用:-XX:+UseZGC,但需确认OS支持(Linux kernel ≥ 4.14)
必须开启GC日志用于后续分析
没日志就等于盲调。建议在JAVA_OPTS中加入:
- -Xlog:gc*:file=/var/log/tomcat/gc.log:time,uptime,level,tags:filecount=5,filesize=100M
- 配合GCeasy或Prometheus + jvm-exporter,可观测GC频率、耗时、各代使用率
- 重点关注:Full GC是否超过1次/小时、Old区占用是否持续>75%、Metaspace是否缓慢增长











