每次部署完專案,重啟Weblogic服務,總是遇到java.lang.OutOfMemoryError: PermGen space,其實實體記憶體也是夠的,當時的解決方法就是多重啟幾次Weblogic來解決這個問題,但是總覺得問題不應該用網管式的方法來解決問題,重啟不應該是萬能的,想著問題可能出現在PermGen space記憶體的大小上,但是根據JVM的機制,不是有自動回收垃圾機制嗎?為什麼不會自動回收呢?在網上找了找資料,瞭解到雖說JVM有自動回收機制,但是JVM對load class不會回收的,PermGen space(這塊正好是存放Class檔案和Meta檔案),所以如果PermGen space設定空間太小必然導致記憶體的溢位。
如何解決PermGen space(permanent heap generation space 永久堆疊方法區)記憶體大小的問題,其實非常簡單,直接對“setDomainEnv.sh”檔案中的 MaxPermSize進行設定,根據伺服器記憶體大小對其進行設定。
setDomainEnv.sh在 “/base_domain/bin”這個目錄下,
vi setDomainEnv.sh
然後查詢“MaxPermSize”,在vi編輯下 ?MaxPermSize,查詢到這個值以後,修改64位和32位這兩個最大永久值,接下重啟Weblogic就OK了。
MEM_MAX_PERM_SIZE_64BIT="-XX:MaxPermSize=512m" export MEM_MAX_PERM_SIZE_64BIT MEM_MAX_PERM_SIZE_32BIT="-XX:MaxPermSize=512m" export MEM_MAX_PERM_SIZE_32BIT
PS:附加一點Weblogic的基本操作,防止自己再次忘記
- 殺掉Weblogic服務,首先查詢 ps -ef|grep weblogic,然後根據ID號,kill -9 ID
- 後臺啟動Weblogic伺服器(進入/base_domain/bin目錄下):nohup ./startWeblogic.sh &