【问题标题】:-XX:OnOutOfMemoryError="<cmd> <arg>" gives Error : Could not find or load main class <arg>-XX:OnOutOfMemoryError="<cmd> <arg>" 给出错误:无法找到或加载主类 <arg>
【发布时间】:2012-09-13 23:11:08
【问题描述】:

我已将 JAVA_OPTS 设置为

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"

然后运行命令“trinidad -p”

在 $TEMP_CMD 中,如果我使用不带任何参数的命令,则会发生 OutOfMemoryError 并且 $TMP_CMD 命令也会运行。但是,如果我在命令中使用任何参数,则会显示以下输出

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

arg 是参数

谁能给我解决办法?

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

【问题讨论】:

  • 什么命令?请添加不起作用的$TEMP_CMD
  • 我试过 $TEMP_CMD="echo success" 和 $TEMP_CMD="\"echo success\""

标签: bash shell jvm quotes


【解决方案1】:

试试

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

【讨论】:

  • 我已经尝试过了,但它并没有逃脱空间。有什么办法可以逃避命令和参数之间的空格?我试过'\'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
  • 2016-06-12
  • 2016-03-16
  • 2016-01-03
相关资源
最近更新 更多