-Xms (初始堆) = 物理記憶體 1/64,-Xmx (最大堆) = 物理記憶體 1/4# 在 "echo \"Using CATALINA_BASE..." 之前新增 JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m"
set JAVA_OPTS=-Xms128m -Xmx350m
注意:若以 Windows 服務啟動 Tomcat,catalina.bat 配置不生效,需修改註冊表:
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions # 原值後追加 -Xms300m -Xmx350m
-Xms = -Xmx — 避免堆動態擴縮容震盪-Xmn ≈ -Xmx 1/4 — 新生代大小PermGen 存放類定義、元資料。JSP 編譯、Spring AOP (CGLIB 動態代理)、熱部署頻繁載入類易導致溢出。JDK 8 移除 PermGen 改用 Metaspace (Native Memory),參數改為 -XX:MetaspaceSize、-XX:MaxMetaspaceSize。
# catalina.sh JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m" # catalina.bat set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
JAVA_OPTS="$JAVA_OPTS -server -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=512m"
# Linux catalina.sh JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxPermSize=128m -XX:MaxNewSize=256m -Djava.awt.headless=true" # 或保守配置 JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m" CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path,用 MAT/Eclipse Memory Analyzer 分析-Xloggc:/path/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps-Xmx 不設 -Xms,導致啟動慢、GC 頻繁catalina.bat 以為生效Tomcat OOM 核心在於 JVM 記憶體區域配置不足或應用存在洩漏。優先通過 JAVA_OPTS/CATALINA_OPTS 調整 Heap 與 PermGen/Metaspace 參數,區分 Linux/Windows 服務啟動方式差異;若調優無效,必須進行 Heap Dump 與 GC 日誌深度分析定位洩漏根因。