WEBLOGIC 記憶體溢位 解決方案(轉)

聽海★藍心夢發表於2012-08-01

前幾天部署WebLogic出現執行緒阻塞情況,檢視後臺報錯:

     後來在公司文件中發現以前所有weblogic的部署使用的JDK都是Sun的,於是沒有進行具體的分析就進行了更換。

     今天客戶報告系統反應極慢 ,檢視後臺發現包記憶體溢位異常,導致整個系統沒有反應,於是進行了重啟才恢復。

------------------------------------------------------------------------

      以下內容轉自其他Blog

------------------------------------------------------------------------

場景:

使用者培訓需要培訓環境,培訓環境搭好後,由於不常更新跑的時間較長,考驗系統穩定性的時候到了,很可惜穩定性這個問題與我們大家的美好願望一直背道而馳,天天求神拜佛也不行很不給面子,發現了一個原因解決了又出現了其他引起當機的因素,弄得是焦頭爛額,下面就是我們發現的一個引起當機的原因,請各位提高警惕。

9月16日系統當機,Weblogic報出java.lang.OutOfMemoryError: PermGen space異常,10-15分鐘後就會發生 <> <> <> <1221538218253> 的錯誤,此時domain的控制檯已經無法訪問。

排查分析:

1、參考tomcatFAQ: 中如下內容:

Why does the memory usage increase when I redeploy a web application?
Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
Tomcat FAQ指出SUN JVM對處於permanent heap generation(預設4M)的內容不做垃圾回收會導致記憶體溢位錯誤。


2、在SUN 官方網站找到一個2003年的bug Report,,Synopsis :PermHeap bloat in and only in server VM,直到現在狀態還是6-Fix Understood, 沒有修復。

解決方案:

根據上面的分析,再結合我們系統的環境(Weblogic 使用Solairs系統安裝的JDK5.0)我們可以確定是由於SUN JVM對permanent heap generation 區域的內容不做垃圾回收造成應用動態Load class檔案過多引起的OutOfMemory錯誤。同時提出兩套解決方案:

增加PermGen space引數大小
更換不同廠家JVM
考慮由於開發採用JDK1.5,換用其他JVM存在風險,故修改weblogic啟動服務呼叫的批處理setDomainEnv.sh檔案,將其中的一截片斷進行修改:
if [ "${JAVA_VENDOR}" = "Sun" ] ; then
        MEM_ARGS="${MEM_ARGS} ${MEM_DEV_ARGS} -XX:MaxPermSize=128m"
        export MEM_ARGS
fi
中MaxPermSize改成1024m,驗證問題是否存在。

實施結果:

系統再未出現OutOfMemoryError執行正常.該原因引起的當機問題解決。

從Java的經典書籍到Sun的官方網站都在宣揚Java的優勢之一——垃圾回收,“自動釋放記憶體,減輕程式設計負擔”,可是誰能想到Sun的JVM還有這問題——不回收load class檔案而產生的Class類物件。所以不要迷信權威,根據現象一步一步抽絲剝繭、細心求證才是王道!

--------------------------------------------------------------------------------------------------------------------------

專案大了以後開發環境頻繁deploy會導致weblogic報permGen 錯誤,查了一下,暫時解決的辦法是:
  在weblogic/common/bin/commEnv.sh中配置

  MEM_ARGS="-Xms32m -Xmx200m -XX:MaxPermSize=128m"

  -Xms:記憶體初始值

  -Xmx:記憶體最大值(不要超過記憶體的80%)

  MaxPermSize:PermGen(Class和Meta存放區域)區域記憶體最大值。

  可調整為:

  MEM_ARGS="-Xms512m -Xmx512m -XX:MaxPermSize=256m"

   -XX:MaxPermSize改為256或512


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/751371/viewspace-739448/,如需轉載,請註明出處,否則將追究法律責任。

相關文章