現象:java.lang.OutOfMemoryError: PermGen space
原因:JVM 永久代存儲 Class 元數據,默認較小(~64MB)。大量 JSP 編譯、第三方 JAR、熱部署導致類加載過多。
解決方案:
# Linux/Mac (catalina.sh)
JAVA_OPTS="-server -XX:PermSize=128M -XX:MaxPermSize=256M"
# Windows 服務模式:修改註冊表
HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\\Parameters\Java
# 修改 JvmMs (初始堆) 和 JvmMx (最大堆)
最佳實踐:將公共 JAR 移至 tomcat/shared/lib 減少重複加載。
現象:java.lang.OutOfMemoryError: Java heap space
原因:對象實例堆積、大對象分配、內存洩漏、GC 頻繁無效。
核心參數:
| 參數 | 含義 | 建議值 |
|---|---|---|
| -Xms | 初始堆大小 | 物理內存 1/4 ~ 1/2 |
| -Xmx | 最大堆大小 | 物理內存 1/2 ~ 3/4 (≤80%) |
| -Xmn | 新生代大小 | 約 1/3 ~ 1/4 堆大小 |
| -XX:SurvivorRatio | Eden/Survivor 比例 | 默認 8:1:1 |
# 在 echo "Using CATALINA_BASE..." 下方添加
JAVA_OPTS="-server -Xms2g -Xmx2g -Xmn512m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
# Linux
export JAVA_OPTS="-Xms2g -Xmx2g"
# Windows 系統變量新增
JAVA_OPTS = -Xms2g -Xmx2g
雙擊 bin\tomcat9w.exe → Java 頁籤 → 設置 Initial/Maximum memory pool → 重啟服務。
-XX:+UseParallelGC 或 G1 -XX:+UseG1GC-Xlog:gc*:file=logs/gc.log:time,uptime:filecount=10,filesize=100m