首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Tomcat PermGen Space OOM 解決:JDK 8+ 元空間替代永久代,調整 MetaspaceSize

     編輯:程式設計綜合問答

錯誤 OutOfMemoryError: PermGen space 僅出現於 **JDK 7 及之前**。JDK 8 移除永久代,改用元空間,錯誤變為 Metaspace OOM。

確認 JDK 版本

java -version
# 若輸出 1.8.x 或 11+,則無 PermGen,問題為 Metaspace

JDK 7 及以下配置 (PermGen)

在 catalina.bat/sh 或 IDE Tomcat 配置中添加:

set JAVA_OPTS=-XX:PermSize=128m -XX:MaxPermSize=512m

MyEclipse: Run Configurations → Arguments → VM arguments 添加上述參數。

JDK 8+ 配置 (Metaspace)

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
  • MetaspaceSize:初始觸發 Full GC 的閾值,設大些減少早期 Full GC。
  • MaxMetaspaceSize:上限,默認無限 (受限於物理內存),建議設值防止佔盡內存。

常見誤區

  • 在 JDK 8 仍設 -XX:MaxPermSize → 被忽略,無效。
  • 只增大 Heap (-Xmx) 不解決元空間/永久代 OOM。
  • 類加載器洩漏 (如熱部署未清理) 導致類元數據積累,需排查代碼而非單純調大參數。

排查步驟

  1. 確認 JDK 版本。
  2. 2. 根據版本設置正確參數 (PermSize 或 MetaspaceSize)。 3. 觀察 GC 日誌 (-Xlog:gc* 或 -XX:+PrintGCDetails) 確認元空間使用趨勢。 4. 若持續增長至上限,使用 jmap -histo:live pid / jcmd pid GC.class_stats 分析類加載器洩漏。 5. 熱部署場景考慮獨立 Tomcat 實例或容器化隔離。

正確配置元空間/永久代參數,並排查類洩漏,徹底解決 OOM。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved