在生產環境中部署 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 調優驗證