tocmat 启动怎么设置 jvm和gc
在生产环境中部署 Java Web 应用时,我们经常需要给 Tomcat 设置 JVM 参数和 GC 策略,以提高性能、稳定性和可观察性。以下是完整教程:
一、Tomcat 设置 JVM 启动参数的方式
1. 修改 startup 脚本(推荐)
以 Linux 系统下的 Tomcat 9 为例,修改 bin/catalina.sh
脚本:
在文件头部(JAVA_OPTS
或新定义)添加:
# JVM 参数配置
JAVA_OPTS="$JAVA_OPTS -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"# GC 策略(根据 JDK 版本选择)
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=100"# 日志 & 可观测性(可选)
JAVA_OPTS="$JAVA_OPTS -Xloggc:/var/log/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
然后运行
bin/startup.sh
即可生效。
2. 设置 setenv.sh(推荐方式)
在 Tomcat 的 bin
目录下新建一个文件 setenv.sh
(Windows 为 setenv.bat
):
#!/bin/bash# JVM 启动参数(可以换成你自己的配置)
JAVA_OPTS="-Xms2g -Xmx2g -Xmn512m -XX:+UseG1GC -XX:MaxGCPauseMillis=100"
JAVA_OPTS="$JAVA_OPTS -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"
JAVA_OPTS="$JAVA_OPTS -Xloggc:/var/log/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
注意:
setenv.sh
被catalina.sh
自动读取,推荐用这个文件管理配置。setenv.sh
的权限必须为可执行:chmod +x setenv.sh
二、根据 JDK 版本选择 GC 策略
JDK版本 | 默认 GC | 推荐 GC(手动指定) |
---|---|---|
JDK8 | Parallel GC | G1GC:-XX:+UseG1GC |
JDK11 | G1GC | G1GC 或 ZGC(实验性) |
JDK17 | G1GC | ZGC(低延迟场景) |
示例:
# JDK8 推荐参数(G1)
JAVA_OPTS="$JAVA_OPTS -XX:+UseG1GC -XX:MaxGCPauseMillis=100"# JDK17 启用 ZGC(超低延迟业务)
JAVA_OPTS="$JAVA_OPTS -XX:+UnlockExperimentalVMOptions -XX:+UseZGC"
三、常见 JVM 参数说明
参数 | 含义 |
---|---|
-Xms2g / -Xmx2g | 初始/最大堆大小 |
-Xmn512m | 年轻代大小 |
-XX:+UseG1GC | 使用 G1 垃圾回收器 |
-XX:MaxGCPauseMillis=100 | G1 最大停顿时间目标(毫秒) |
-XX:MetaspaceSize=128m | 元空间初始大小 |
-XX:MaxMetaspaceSize=256m | 元空间最大大小 |
-Xloggc:gc.log | GC 日志路径 |
-XX:+PrintGCDetails | 打印 GC 详情 |
-XX:+PrintGCDateStamps | 打印 GC 时间戳 |
四、检查是否生效
ps -ef | grep tomcat
查看启动命令中是否包含你配置的 -Xmx
, -XX:+UseG1GC
等。
或者在 Tomcat 管理台访问 /manager
界面,查看 JVM 状态。
五、建议
- 堆大小设置不要超过服务器物理内存的 60~70%
- GC 日志建议开启,并定期分析
- 使用
jstat
,jmap
,jvisualvm
,Arthas
等工具动态监控 - 建议业务高峰期进行压测和 GC 调优验证