tomcat jvm参数必须按启动方式精准配置:脚本启动改setenv.sh/bat,windows服务用tomcatw.exe配置,ide启动改run configuration,systemd则改service文件;改完需用ps或jstat验证生效。

直接改 JAVA_OPTS 或 CATALINA_OPTS 里的 -Xmx 值,重启生效——但必须确认 Tomcat 启动方式,否则改了白改。
怎么看当前 Tomcat 是怎么启动的
不同启动方式读取 JVM 参数的位置完全不同:
- 用
startup.sh/startup.bat启动:优先读setenv.sh(Linux)或setenv.bat(Windows),不存在则 fallback 到catalina.sh/catalina.bat - 注册为 Windows 服务(如通过
tomcat8w.exe安装):完全不读脚本,只认服务配置界面里的 Java 选项卡 - 被 IDE(如 IntelliJ、Eclipse)托管启动:参数在 IDE 的 Run Configuration → VM options 里,改脚本无效
- 通过 systemd(Linux)或 launchd(macOS)管理:参数写在 service 文件的
Environment=或ExecStart=中,和脚本无关
Linux 下推荐改 setenv.sh 而不是 catalina.sh
直接改 catalina.sh 容易在升级 Tomcat 时被覆盖;setenv.sh 是专为自定义设计的入口文件,且不会被覆盖:
- 进入
$CATALINA_HOME/bin目录 - 若无
setenv.sh,新建一个,内容为:#!/bin/sh export JAVA_OPTS="-Xms2g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
- 赋予执行权限:
chmod +x setenv.sh - 注意:Java 8+ 不再用
-XX:PermSize,改用-XX:MetaspaceSize和-XX:MaxMetaspaceSize
Windows 服务方式必须用 tomcatw.exe 配置
哪怕你改了 catalina.bat,只要 Tomcat 是作为系统服务运行,这些修改就完全不生效:
- 找到
%CATALINA_HOME%\bin\tomcat8w.exe(版本号可能不同) - 右键 → “Run as administrator” → 切换到 “Java” 选项卡
- 在 “Java Options” 文本框顶部添加:
-Xms2g -Xmx4g -XX:MetaspaceSize=256m - 下方 “Initial memory pool” 和 “Maximum memory pool” 两个字段是只读显示,实际以 Java Options 为准
- 点 “Apply” → 重启服务(不是 restart,是先 stop 再 start)
验证 -Xmx 是否真正生效
别信日志或配置文件,要看 JVM 进程实际加载的参数:
- Linux:
ps aux | grep tomcat | grep -o 'Xmx[0-9a-zA-Z]\+',应输出类似Xmx4g - Windows:任务管理器 → 详细信息 → 右键列标题 → 选择“命令行”,找 java 进程的启动参数
- 更准的方式:用
jstat -gc <pid></pid>查看堆容量,其中max列对应的就是-Xmx值(单位 KB) - 常见坑:
-Xmx4G和-Xmx4g都合法,但-Xmx4GB会报错;数字后不能带空格,如-Xmx 4g无效
最容易被忽略的是:Tomcat 启动脚本里可能同时存在 JAVA_OPTS、CATALINA_OPTS、JRE_HOME 等多个环境变量,而不同 Tomcat 版本对它们的优先级处理不一致。最稳妥的做法是——只在一个地方设 -Xmx,并确保它没被后续脚本覆盖重置。











