weblogic報java.lang.OutOfMemoryError: PermGen space,permgen
記憶體溢出是軟體開發過程中經常遇到的一些問題,在本地使用weblogic中介軟體的時候,可能會經常打包部署應用,重複多次之後,就可能出現記憶體溢出的情況。
1 發現問題
在部署的時候,遇到相同的包,一般直接使用“更新”功能,更新多次之後,發現項目部署的越來越慢,而且還會列印java.lang.OutOfMemoryError: PermGen space
,OutOfMemoryError
是記憶體溢出,PermGen space
說明是永久代(即方法區)發生異常。
2 分析問題
在Tomcat的Wiki頁面中記錄過這種問題:
Why does the memory usage increase when I redeploy a web application?
That is because your web application has a memory leak.
A common issue are “PermGen” memory leaks. They happen because the Classloader (and the Class objects it loaded) cannot be recycled unless some requirements are met (*). They are stored in the permanent heap generation by the JVM, and when you redeploy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
(*) The requirement is that all classes loaded by this classloader should be able to be gc’ed at the same time.
這也算是它山之石可以攻玉了。產生上面問題應該也是JVM虛擬機器對永久代地區的內容做記憶體回收造成應用動態載入類檔案過多引起的記憶體溢出錯誤。
3 解決問題
在weblogic域的bin目錄中(我的是D:\Develop\Weblogic\wls12120\user_projects\domains\mydomain\bin)的setDomainEnv.cmd(linux對應修改setDomainEnv.sh),尋找-XX:MaxPermSize
:
set MEM_MAX_PERM_SIZE_64BIT=-XX:MaxPermSize=256mset MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=256m
這個參數是設定永久代地區的最大值,預設是256M,直接改成512M(可以根據自己電腦配置適當增大),儲存,然後重新啟動weblogic。發現weblogic運行速度加快,並且只有當本機記憶體被其他應用佔用很多的時候才會再次出現這種錯誤。
問題解決。
註:PermGen space,permanent heap generation space,即永久代或方法區。