java.lang.OutOfMemoryError: PermGen space
環境:Spring + Struts2 + MyBatis,Tomcat 7.x,MyEclipse 10。項目啟動時報錯。
永久代 存放類元數據(Class、Method、常量池等)。熱部署/大量類加載/第三方庫多時,默認 64MB/82MB 易耗盡。
JDK 8+ 已移除永久代,改用 Metaspace,但 Tomcat 7 / JDK 7 仍存在此問題。
-server -Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=512m
| 參數 | 含義 | 建議值 |
|---|---|---|
-Xms | 堆初始大小 | 256m~512m |
-Xmx | 堆最大大小 | 512m~2g (視物理內存) |
-XX:PermSize | 永久代初始大小 | 64M~128M |
-XX:MaxPermSize | 永久代最大大小 | 256M~512M+ |
-server | Server 模式 JIT 優化 | 生產必加 |
jmap -histo:live pid / VisualVM 觀察類數量增長。String.intern() / 常量池膨脹 → 改用對象池或升級 JDK 8+ (常量池移至堆)。若升級 JDK 8,永久代參數失效,改用:
-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=512M
核心動作:**給永久代足夠空間 (-XX:MaxPermSize=512m)**,配合監控防洩漏,徹底解決啟動期 PermGen OOM。