# Tomcat 部署与 JVM 参数 ## 场景 要跑一个 Java Web 应用(war 包),需要配好 JDK、堆内存和端口。 ## 前置条件 - 装好对应版本的 JDK - 应用需要的端口(默认 8080) - 知道应用大概的内存需求 ## 配置 ```bash # 下载解压 tar xzf apache-tomcat-9.0.x.tar.gz -C /opt ln -s /opt/apache-tomcat-9.0.x /opt/tomcat # 用独立用户跑 useradd -r -s /usr/sbin/nologin tomcat chown -R tomcat:tomcat /opt/apache-tomcat-9.0.x # JVM 参数 cat >/opt/tomcat/bin/setenv.sh <<'EOF' export JAVA_HOME=/usr/lib/jvm/java-17-openjdk export CATALINA_OPTS="-Xms2g -Xmx2g -XX:+UseG1GC \ -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/dumps \ -Dfile.encoding=UTF-8 -Duser.timezone=Asia/Shanghai" EOF chmod +x /opt/tomcat/bin/setenv.sh # 部署 cp app.war /opt/tomcat/webapps/ ``` ## 验证 ```bash ss -lntp | grep 8080 curl -I http://127.0.0.1:8080/app/ tail -f /opt/tomcat/logs/catalina.out ``` 看是否 OOM: ```bash grep -i "outofmemory" /opt/tomcat/logs/catalina.out jstat -gc 1000 5 ``` ## 回滚 ```bash rm -rf /opt/tomcat/webapps/app # 或者换回上一个 war ``` ## 坑 - **`-Xmx` 设得比物理内存还大**,容器或系统会先被 OOM killer 干掉。 - 时区不设,日志时间差 8 小时。 - 编码不设 UTF-8,中文参数乱码。 - war 包名决定访问路径,改名等于改 URL。 - `catalina.out` 不会自动切割,一个月能到几十 G。 - 用 root 跑 tomcat,出问题权限一堆。