1. 程式人生 > >Weblogic啟動web應用報記憶體溢位錯誤

Weblogic啟動web應用報記憶體溢位錯誤

前言:
專案中使用Weblogic 11g作為應用伺服器部署一個web應用,web中內嵌了一個j2ee應用,所以總體佔用記憶體比較大,開發環境使用的tomcat都沒有問題,之後向Weblogic做遷移的時候,啟動就報了很多錯誤,諸如jar包衝突、記憶體溢位之類的,這裡講所遇問題以及解決方法記錄下,以供遇到相同問題時參考。

一、jar包衝突

如果啟動的時候報java.lang.ClassCastException型別轉換錯誤,並且錯誤出現在依賴的第三方jar包,而非自身應用的話,那很有可能是出現了自帶jar包與weblogic帶的jar包有重複,建議刪除自己工程中的此類jar包,我的專案中衝突的jar包是javax.xml和w3c相關的包,刪掉含有此內容的包再啟動就沒問題了,weblogic自帶了解析xml的包,不需要擔心。
1.配置weblogic.xml檔案
weblogic.xml是必須要的,放在WEB-INF下和web.xml同級,可以嘗試在裡面加入下面的屬性

<container-descriptor> 
  <prefer-web-inf-classes>true</prefer-web-inf-classes>
 </container-descriptor>

從節點名稱上也能比較清楚知道該設定的含義,優先使用Web應用里加載的類。但實際上,即便如此配了,上述衝突的問題依然沒有解決,因此只能進行刪除
2.刪除衝突jar包
這次出現的問題是因為javax.xml和w3c中xml的包衝突導致的,刪除後就沒有問題了,是否還有其他jar包衝突,待遇到後會及時補充,附含有javax.xml的包:
jaxrpc.jar
stax.jar
wstx.jar
xml-apis.jar

二、記憶體溢位

報java.lang.OutOfMemoryError:PermGen space
我們都知道java啟動的時候需要輸入啟動引數,包括-Xms(記憶體初始分配值),-Mmx(記憶體最大允許分配的堆值),-XX:PermSize(初始分配PermGen區域值),-XX:MaxPermSize(PermGen區域的最大值)。
這其中PermGen space的全稱是Permanent Generation space,是指記憶體的永久儲存區域,這塊記憶體主要是被JVM存放Class和Meta資訊的,Class在被Loader時就會被放到PermGen space中,它和存放類例項(Instance)的Heap區域不同,GC(Garbage Collection)不會在主程式執行期對PermGen space進行清理,所以如果你的應用中有很多CLASS的話,就很可能出現PermGen space錯誤,這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小(4M)那麼就會產生此錯誤資訊了。
1.所以我們需要修改weblogic啟動domain時的記憶體引數:
在檔案/bea/user_projects/domains/{domain_name}/bin/setDomainEnv.sh中
根據使用JVM的廠商,修改對應分支的引數,下面是SUN的情況

if [ "${JAVA_VENDOR}" = "Sun" ] ; then
        MEM_ARGS="${MEM_ARGS} ${MEM_DEV_ARGS} -XX:MaxPermSize=128m"
        export MEM_ARGS
fi

中MaxPermSize調大,再驗證問題是否還存在。
2.若是問題還在,如果修改分支沒錯的話,再嘗試修改另一個檔案
修改weblogic安裝目錄下wlserver\common\bin\commEnv.cmd,找到set MEM_ARGS=-Xms32m -Xmx200m -XX:MaxPermSize=128m,修改成set MEM_ARGS=-Xms256m -Xmx512m -XX:MaxPermSize=256m,可根據機器配置調整。其中有針對oracle自己jvm和sun jvm的配置,我使用的是sum的jvm所以只修改了“:sun”下面的MEM_ARGS。