開發中遇到Eclipse報錯:java.lang.OutOfMemoryError: PermGen space。
PermGen space百度翻譯為:永久區域內存不足。
1. 先來一張jvm結構圖:
內存不足問題一般都是發生在'堆'上,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
至此,內存溢出的問題應該就解決了。