首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 程式設計入門

Windows 批次檔啟動 Tomcat 遭遇 PermGen Space 記憶體溢位完整解決方案

     編輯:Java 程式設計入門

問題現場

在 Windows Server 2008 R2(64GB 記憶體、8 核心)上,單一 Tomcat 部署兩個應用,執行 startup.bat 後控制台拋出:

java.lang.OutOfMemoryError: PermGen Space

PermGen Space 根本原因

Permanent Generation Space 是 JVM 儲存類別元資料(Class、Method、Field 元資料)的區域,與存放物件實例的 Heap 區域分離。關鍵特性:

  • GC 在主程式執行期不回收 PermGen
  • JSP 預編譯、大量第三方 JAR、熱部署頻繁會快速填滿 PermGen
  • JVM 預設大小僅 64MB(JDK 7)或 82MB(JDK 8),極易不足

核心解決方案:修改 catalina.bat 增加 PermGen 參數

修改前

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 最大上限,視應用類別數量調整

其他環境對應解決方案

1. Eclipse 開發環境

修改 eclipse.ini:

-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms128m
-Xmx512m
-XX:PermSize=64M
-XX:MaxPermSize=128M

2. Windows 服務模式啟動 Tomcat

修改註冊表:HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat版本\Parameters\Java\Options,新增:

-XX:PermSize=256m
-XX:MaxPermSize=512m

3. Linux 系統

修改 catalina.sh:

JAVA_OPTS="-Xms1024m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m"

重要提醒:JDK 8 之後的變化

JDK 8 移除 PermGen,改用 Metaspace(元空間),預設不限制大小(受限於本機記憶體)。對應參數變更為:

-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m

若專案已遷移至 JDK 8+,請改用上述 Metaspace 參數。

驗證與監控

  • 啟動後觀察日誌無 OutOfMemoryError: PermGen Space
  • 使用 jconsole 或 VisualVM 監控 PermGen/Metaspace 使用率
  • 設定警報:使用率超過 80% 觸發告警

總結

PermGen 溢位本質是類別元資料超出預設限制。透過調整 PermSize/MaxPermSize(JDK 7)或 MetaspaceSize/MaxMetaspaceSize(JDK 8+)即可徹底解決。建議將參數調整納入部署標準化流程,避免上線驚喜。

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