錯誤 OutOfMemoryError: PermGen space 僅出現於 **JDK 7 及之前**。JDK 8 移除永久代,改用元空間,錯誤變為 Metaspace OOM。
java -version
# 若輸出 1.8.x 或 11+,則無 PermGen,問題為 Metaspace
在 catalina.bat/sh 或 IDE Tomcat 配置中添加:
set JAVA_OPTS=-XX:PermSize=128m -XX:MaxPermSize=512m
MyEclipse: Run Configurations → Arguments → VM arguments 添加上述參數。
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
MetaspaceSize:初始觸發 Full GC 的閾值,設大些減少早期 Full GC。MaxMetaspaceSize:上限,默認無限 (受限於物理內存),建議設值防止佔盡內存。-XX:MaxPermSize → 被忽略,無效。-Xmx) 不解決元空間/永久代 OOM。PermSize 或 MetaspaceSize)。
3. 觀察 GC 日誌 (-Xlog:gc* 或 -XX:+PrintGCDetails) 確認元空間使用趨勢。
4. 若持續增長至上限,使用 jmap -histo:live pid / jcmd pid GC.class_stats 分析類加載器洩漏。
5. 熱部署場景考慮獨立 Tomcat 實例或容器化隔離。
正確配置元空間/永久代參數,並排查類洩漏,徹底解決 OOM。