開發中遇到Eclipse報錯:java.lang.OutOfMemoryError: PermGen space。
PermGen space百度翻譯為:永久區域記憶體不足。
1. 先來一張jvm結構圖:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SNkhDMldTZ4UmZhF2M5IGOzEWOkNDNzATOjJWO4YWOk9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
記憶體不足問題一般都是發生在'堆‘上,GC作用區域也是在'堆‘上。
2. 這個'堆‘又劃分成了好幾塊區域,包括:
新生代:包括伊甸園區和存活區。
老年代:
永久帶:jdk1.8後變成元空間,元空間不再占用堆中的空間,而永久帶卻是在堆中開辟空間。
可以發現,堆中就有個永久區。永久區的記憶體溢出,其實就是堆的記憶體不夠用。
隻需要調大堆的記憶體大小就可以解決問題。
3. 調整堆大小的參數:
-Xms256m -Xmx1024m
-Xms:堆的初始化大小,這裡設定成了256m.
-Xmx:堆最大的大小,這個設定成了1024m.
這裡面就存在了一個可伸縮的空間,而這個空間的存在會損耗服務的性能。因為擴容和釋放空間都是有性能損耗的。
最好的辦法就是:-Xms和-Xmx設定成同樣的大小。這樣就不存在可伸縮的空間了。
4. jvm參數的配置位置。
a. 如果是使用tomcat服務:
修改tomcat/bin目錄下的catalina.bat。(windows環境下修改檔案catalina.bat, linux環境下修改檔案catalina.sh)
配置在檔案的第一行:
b.如果是eclipse
修改eclipse的Run Configurations。(如果是debug模式,修改Debug Configurations。)
寫在此處,友善拷貝:
-Xms256m -Xmx1024m -XX:MaxNewSize=512m -XX:MaxPermSize=512m
c.如果已經被配置成了服務
這種情況,就需要修改系統資料庫了。
c1. regedit指令打開系統資料庫。
c2. 找到配置的tomcat服務。
修改:JvmMs,JvmMx,Options裡面的參數值。
c3. 修改完畢後需要重新開機服務。
d. Eclipse的配置檔案eclipse.ini中也可以配置jvm參數。
-vmargs
-Xms512m
-Xmx1024m
-XX:PermSize=256M
-XX:MaxPermSize=512M
至此,記憶體溢出的問題應該就解決了。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。