設定 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