設定 WebLogic 的 memory 參數
注意
這篇文章是 WebLogic 10 的時代寫的, 並沒有在後續版本測試過.
問題
這是第二次吃虧了, 把他記下來, 免得下次又忘記了...
問題的起源在於記憶體不足, 通常訊息如下. 一次是某個單一 XML 訊息太大, 另一次是 ear 檔案太大, re-deploy 的時候會出問題.
java.lang.OutOfMemoryError: PermGen space
解法
如果是簡單的 Java 程式, 那解法很簡單, 改參數就好了, 把 -XX:PermSize=*** 放大即可. 不過在 WebLogic 裡面, script 包了好幾層, 就很容易漏掉了. 這次就是因為呆呆的直接在最外層設定 MEM_ARGS, 然後被裡層的 script 蓋掉了, 所以當然沒作用...
建議的作法是修改 USER_MEM_ARGS
, 可參考 Modifying JVM Parameters in Server Start Scripts
最後, 在 WebLogic 10, 設定環境變數的程式在 domains//bin/setDomainEnv.sh, 可以看出不同平台, 甚至 production/develop mode 的不同也會導致參數不同, 不過不建議改這裡.
1if [ "${JAVA_VENDOR}" = "Sun" ] ; then
2 if [ "${PRODUCTION_MODE}" = "" ] ; then
3 MEM_DEV_ARGS="-XX:CompileThreshold=8000 -XX:PermSize=48m "
4 export MEM_DEV_ARGS
5 fi
6fi
7
8# Had to have a separate test here BECAUSE of immediate variable expansion on windows
9
10if [ "${JAVA_VENDOR}" = "Sun" ] ; then
11 MEM_ARGS="${MEM_ARGS} ${MEM_DEV_ARGS} -XX:MaxPermSize=128m"
12 export MEM_ARGS
13fi
14
15if [ "${JAVA_VENDOR}" = "HP" ] ; then
16 MEM_ARGS="${MEM_ARGS} -XX:MaxPermSize=128m"
17 export MEM_ARGS
18fi
19
20# IF USER_MEM_ARGS the environment variable is set, use it to override ALL MEM_ARGS values
21
22if [ "${USER_MEM_ARGS}" != "" ] ; then
23 MEM_ARGS="${USER_MEM_ARGS}"
24 export MEM_ARGS
25fi