在 Windows Server 2008 R2(64GB 記憶體、8 核心)上,單一 Tomcat 部署兩個應用,執行 startup.bat 後控制台拋出:
java.lang.OutOfMemoryError: PermGen Space
Permanent Generation Space 是 JVM 儲存類別元資料(Class、Method、Field 元資料)的區域,與存放物件實例的 Heap 區域分離。關鍵特性:
rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8" -Dsun.jnu.encoding="UTF8" -Ddefault.client.encoding="UTF-8" -Duser.language=Zh
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:MaxNewSize=512m
rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding="UTF-8" -Dsun.jnu.encoding="UTF8" -Ddefault.client.encoding="UTF-8" -Duser.language=Zh
set JAVA_OPTS=%JAVA_OPTS% -server -Xms1024m -Xmx1024m -XX:MaxNewSize=512m -XX:PermSize=256m -XX:MaxPermSize=512m
參數說明:
-XX:PermSize=256m:PermGen 初始大小,避免動態擴容效能損耗-XX:MaxPermSize=512m:PermGen 最大上限,視應用類別數量調整修改 eclipse.ini:
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms128m
-Xmx512m
-XX:PermSize=64M
-XX:MaxPermSize=128M
修改註冊表:HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat版本\Parameters\Java\Options,新增:
-XX:PermSize=256m
-XX:MaxPermSize=512m
修改 catalina.sh:
JAVA_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"
JDK 8 移除 PermGen,改用 Metaspace(元空間),預設不限制大小(受限於本機記憶體)。對應參數變更為:
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m
若專案已遷移至 JDK 8+,請改用上述 Metaspace 參數。
OutOfMemoryError: PermGen Spacejconsole 或 VisualVM 監控 PermGen/Metaspace 使用率PermGen 溢位本質是類別元資料超出預設限制。透過調整 PermSize/MaxPermSize(JDK 7)或 MetaspaceSize/MaxMetaspaceSize(JDK 8+)即可徹底解決。建議將參數調整納入部署標準化流程,避免上線驚喜。