2012-09-21 32 views
0

我已經設置JAVA_OPTS爲-XX:OnOutOfMemoryError = 「<cmd><arg>」 給出錯誤:無法找到或加載主類<arg>

export JAVA_OPTS="$JAVA_OPTS -server -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:gc.log -Dcom.sun.management.jmxremote.ssl=false -Xms100m -Xmx100m -XX:MaxPermSize=5M -XX:ReservedCodeCacheSize=100m -Xss100k -XX:NewRatio=2 -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:CompileThreshold=100 -XX:HeapDumpPath=/usr/share/$package -XX:-HeapDumpOnOutOfMemoryError -XX:OnError=$TEMP_CMD -XX:OnOutOfMemoryError=$TEMP_CMD" 

則正在運行命令 「千里-p」

在$ TEMP_CMD,如果我使用沒有任何參數的命令,則會發生OutOfMemoryError,並且$ TMP_CMD命令也會運行。但是,如果使用任何參數與命令,然後顯示以下輸出

Error: Could not find or load main class <arg> 

arg爲參數

誰能給我解決?

在trinidad.yml或任何其他cofig文件中是否有任何更改?

+0

什麼命令?添加不起作用的$ TEMP_CMD – ssedano

+0

我試過了$ TEMP_CMD =「echo success」和$ TEMP_CMD =「\」echo success \「」 – msfk

回答

5

嘗試

export JAVA_OPTS="... \"-XX:OnError=$TEMP_CMD\" ..."

export JAVA_OPTS='... "-XX:OnError=$TEMP_CMD" ...'

Bash nested quotes and evalhttp://www.grymoire.com/Unix/Quote.html

更新

上面似乎還沒有測試後,開始工作。

test.sh

JAVA_OPTS="$JAVA_OPTS -Xmx32m '-XX:OnOutOfMemoryError=echo %p'" 
java $JAVA_OPTS Test 

$ bash -x ./test.sh 
+ JAVA_OPTS=' -Xmx32m '\''-XX:OnOutOfMemoryError=echo %p'\''' 
+ java -Xmx32m ''\''-XX:OnOutOfMemoryError=echo' '%p'\''' Test 
Exception in thread "main" java.lang.NoClassDefFoundError: '-XX:OnOutOfMemoryError=echo 

失敗。

JAVA_OPTS="$JAVA_OPTS -Xmx32m -XX:OnOutOfMemoryError=\"echo %p\"" 
java $JAVA_OPTS Test 

$ bash -x ./test.sh 
+ JAVA_OPTS=' -Xmx32m -XX:OnOutOfMemoryError="echo %p"' 
+ java -Xmx32m '-XX:OnOutOfMemoryError="echo' '%p"' Test 
Exception in thread "main" java.lang.NoClassDefFoundError: %p" 

失敗。

診斷與-x bash選項幫助谷歌問題的根源在於bash變量替換和分詞規則的奇怪組合:http://mywiki.wooledge.org/BashFAQ/050

有幾種可能的解決方法。

1)使用輔助腳本來擺脫頑固空間

JAVA_OPTS+=" -Xmx32m -XX:OnOutOfMemoryError=/usr/tmp/test/oom.sh" 
java $JAVA_OPTS Test 

2)的移動OnOutOfMemoryError出的可變

JAVA_OPTS="$JAVA_OPTS -Xmx32m" 
java $JAVA_OPTS -XX:OnOutOfMemoryError="echo %p" Test 

$ bash -x ./test.sh 
+ JAVA_OPTS=' -Xmx32m' 
+ /usr/java/jdk1.6.0_16/bin/java -Xmx32m '-XX:OnOutOfMemoryError=echo %p' Test 
# 
# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="echo %p" 
# Executing /bin/sh -c "echo 1639"... 
1639 
+0

我試過了,但它並沒有逃脫這個空間。有什麼辦法可以擺脫命令和參數之間的空白嗎?我試過'\' – msfk

+0

查看更新後的答案。 – Vadzim

相關問題