記憶體溢出是軟體開發過程中經常遇到的一些問題,在本地使用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=256m
set MEM_MAX_PERM_SIZE_32BIT=-XX:MaxPermSize=256m
這個參數是設定永久代區域的最大值,預設是256M,直接改成512M(可以根據自己電腦組態适當增大),儲存,然後重新啟動weblogic。發現weblogic運作速度加快,并且隻有當本機記憶體被其他應用占用很多的時候才會再次出現這種錯誤。
問題解決。
注:PermGen space,permanent heap generation space,即永久代或方法區。