2011-04-26 29 views
24

Tengo un problema al intentar pasar el comando -XX:OnOutOfMemoryError="kill -9 %p" en mi jvm args.-XX: OnOutOfMemoryError = "kill -9% p" Problema

Estoy usando Jetty7, y tengo esto dentro del archivo start.ini. En el arranque me da el siguiente error. Esto es con el JRE /jre1.6.0_03l64

embarcadero de inicio: EMPEZAR embarcadero Mar Abr 26 de 2011 09:54:26 EDT
opción no reconocido: -9
No se pudo crear la máquina virtual de Java.

El archivo start.ini es como a continuación.

#=========================================================== 
# If the arguements in this file include JVM arguments 
# (eg -Xmx512m) or JVM System properties (eg com.sun.???), 
# then these will not take affect unless the --exec 
# parameter is included or if the output from --dry-run 
# is executed like: 
# eval $(java -jar start.jar --dry-run) 
# 
# Below are some recommended options for Sun's JRE 
#----------------------------------------------------------- 
    --exec 
# -Dcom.sun.management.jmxremote 
    -Xmx4096m 
    -Xmn512m 
    -DLABEL=PROD_APP 
    -verbose:gc 
    -Xloggc:/export/opt/prod_app/logs/gc.log 
    -XX:OnOutOfMemoryError="kill -9 %p" 
# -XX:+PrintGCDateStamps 
    -XX:+PrintGCTimeStamps 
    -XX:+PrintGCDetails 
    -XX:+PrintTenuringDistribution 
# -XX:+PrintCommandLineFlags 
# -XX:+DisableExplicitGC 
# -XX:+UseConcMarkSweepGC 
# -XX:ParallelCMSThreads=2 
# -XX:+CMSClassUnloadingEnabled 
# -XX:+UseCMSCompactAtFullCollection 
# -XX:CMSInitiatingOccupancyFraction=80 

Comentando la salida de la línea de embarcadero comenzará bien sin ningún problema. Sin embargo, realmente necesitamos agregar este argumento debido a la pérdida de memoria con el sistema para evitar daños adicionales si nuestro proceso se cae.

¿Alguien podría tener alguna idea de lo que estoy haciendo mal aquí o cómo puedo solucionarlo?

+0

Tuve problemas con algo similar también pero estaba en mis propios archivos de lote/bash. Quizás Jetty pone sus propias citas sobre todo en el archivo .ini. ¿Podría probar con comillas simples (') en su lugar? –

+0

Me pregunto por qué no funciona ... Dice '-XX: OnOutOfMemoryError =" ; "\t Ejecutar comandos definidos por el usuario cuando se lanza por primera vez OutOfMemoryError. (Introducido en 1.4.2 actualización 12, 6) 'http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html – eee

+0

¿Alguna solución factible para este problema? – sorin

Respuesta

3

Creo que usted necesita para citar a toda la opción, así:

"-XX:OnOutOfMemoryError=kill -9 %p" 
+0

Si puse una cita sobre la opción completa, entonces la identificación no aparece en los argumentos reales del proceso, hubiera esperado verla aquí. Aunque se inicia, que es positivo. // 1526 1506 99 04:51 pts/2 00:00:05 /usr/java/jre1.6.0_03l64/bin/java -Xmx4096m -Xmn512m -verbose: gc -Xloggc:/export/opt/atdirect_dev/logs/gc .log -XX: + PrintGCTimeStamps -XX: + PrintGCDetails -XX: + PrintTenuringDistribution -Djetty.home =/export/opt/PROD_APP -Dprod_app.connection-client.cfg =/export/opt/PROD_APP/lib/PROD/prod. connection-client.cfg -DLABEL = PROD_APP – Patrick

0

incluso he intentado incorporar un espacio utilizando% 20, pero que fue tomado literalmente. Entonces, cuando obtuvo un OOM, falló diciendo que el comando (con el% 20 incorporado) no se pudo encontrar. Loco, lo sé, pero valió la pena intentarlo ... :)

Tal vez se supone que debemos usar el < real y> como los documentos de Sun ?! : P Lo intentaré ... :)

0

¿Qué tal si en lugar de invocar kill, ejecuta un script de shell que invoca kill con el pid pasado como argumento (aún tendría un espacio, pero no -9 indicador)

p. Ej. -XX:OnOutOfMemoryError='/path/killdash9.sh %p'

Si todavía no puede tener el espacio, ¿puede intentar que el script de shell encuentre el pid asociado con esa instancia de Jetty? Todo un truco, pero podría funcionar.

1

Encontré esta opción en un script y quería obtener más información al respecto, y google me trajo aquí. En el script en cuestión la opción se da como

-XX:OnOutOfMemoryError='"kill -9 %p"' 

también lo es entre comillas dobles el comando, y el valor de opción es única citado. Esta no es una de las formas que se muestran en las otras respuestas, entonces ¿quizás hará lo que usted quiere?

2

Ejecutando como una opción de hadoop, corro a los mismos problemas. Esta fue la respuesta:

-XX:OnOutOfMemoryError='kill -9 %p' 

Aquí está la salida estándar de OOM:

# 
# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="kill -9 %p" 
# Executing /bin/sh -c "kill -9 11902"... 

También probé:

-XX:OnOutOfMemoryError='"kill -9 %p"' 

Comenzó, pero en OOM que

# java.lang.OutOfMemoryError: Java heap space 
# -XX:OnOutOfMemoryError="kill' '-9' '%p" 
# Executing /bin/sh -c "kill' '-9' '1164"... 

Pero STDERR tiene: sh: kill -9 1164: comando no encontrado

Estos ni siquiera comenzar:

'-XX:OnOutOfMemoryError=kill -9 %p' 
"-XX:OnOutOfMemoryError=kill -9 %p" 
-XX:OnOutOfMemoryError="kill -9 %p" 
+0

Abrí un error para esto aquí: https://bugs.eclipse.org/bugs/show_bug.cgi?id=408904 Esto debería haber sido reportado como un error hace años y podríamos haberlo solucionado antes. –

+2

El error 'sh: kill -9 1164: command not found' le dice qué es importante. Que el ejecutable pasado a sh es 'kill -9 1164' (nota, este es el nombre del ejecutable que está tratando de ejecutar). Prueba: si escribe algo como '$ blargfish -9 1164' en su línea de comandos en este momento, obtendrá' blarghfish: command not found'. Observe que los argumentos de línea de comando no están presentes en el mensaje de error. –

3

me he encontrado a través de este problema bastante recientemente. Lo he resuelto estableciendo la opción en la variable de entorno JAVA_TOOL_OPTIONS. Esta variable está documentada by Oracle y debe export esta variable en sus comandos de shell y la JVM se agregará a los argumentos.

8

En la versión de Java 8u92 los argumentos de VM

  • -XX:+ExitOnOutOfMemoryError
  • -XX:+CrashOnOutOfMemoryError

se añadieron, ver el release notes.

ExitOnOutOfMemoryError
Cuando se habilita esta opción, la JVM sale en la primera ocurrencia de un error de falta de memoria. Se puede usar si prefiere reiniciar una instancia de la JVM en lugar de manejar los errores de memoria .

CrashOnOutOfMemoryError
Si esta opción está activada, cuando se produce un error fuera de la memoria, los accidentes de JVM y produce texto y archivos binarios de choque.

Mejora de pedidos: JDK-8138745 (parámetro de denominación es incorrecta aunque JDK-8154713, ExitOnOutOfMemoryError en lugar de ExitOnOutOfMemory)

0

Las siguientes obras

java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'" $JVM_ARGS $MAIN 

La mayoría de las respuestas proporcionadas no funcionan.

Sin embargo, si desea ponerlo en, por ejemplo, la variable $ JVM_ARGS en la que te encuentras para un mundo de dolor.

Cuestiones relacionadas