web-dev-qa-db-fra.com

-XX: OnOutOfMemoryError = "kill -9% p" Problème

J'ai un problème à essayer de passer la commande -XX:OnOutOfMemoryError="kill -9 %p" dans mes arguments jvm.

J'utilise Jetty7 et je l'ai dans le fichier start.ini. Au démarrage, donnez-moi l'erreur ci-dessous. C'est avec jre /jre1.6.0.0_03l64

Au départ de Jetty: STARTED Jetty Mar 26 Avr 09:54:26 EDT 2011
Option non reconnue: -9
N'a pas pu créer la machine virtuelle Java.

Le fichier start.ini est comme ci-dessous.

#===========================================================
# 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

Commenter la jetée de sortie commencera sans problème. Cependant, nous avons vraiment besoin d'ajouter cet argument en raison d'une fuite de mémoire avec le système pour éviter des dommages supplémentaires si notre processus échoue.

Quelqu'un aurait-il une idée de ce que je fais mal ici ou de la façon dont je peux résoudre ce problème?

28
Patrick

Dans la version 8u92 de Java, les arguments VM 

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

ont été ajoutés, voir les notes de version .

ExitOnOutOfMemoryError
Lorsque vous activez cette option, la machine virtuelle Java se ferme sur le fichier première occurrence d'une erreur de mémoire insuffisante. Il peut être utilisé si vous préférez redémarrer une instance de la machine virtuelle Java plutôt que de traiter avec erreurs de mémoire. 

CrashOnOutOfMemoryError
Si cette option est activée, lorsqu’un fichier Une erreur de mémoire insuffisante se produit, la machine virtuelle Java se bloque et produit du texte et fichiers d'erreur binaires.

Requête d'amélioration: JDK-8138745 (la désignation du paramètre est fausse, bien que JDK-8154713 , ExitOnOutOfMemoryError au lieu de ExitOnOutOfMemory)

15
flavio.donze

J'ai traversé ce problème assez récemment. Je l'ai résolu en définissant l'option dans la variable d'environnement Java_TOOL_OPTIONS. Cette variable est documentée par Oracle et vous devez export cette variable sur vos commandes Shell et la JVM l'ajoutera aux arguments.

3
rscarvalho

Je crois que vous devez citer l’option entière, comme ceci:

  "-XX:OnOutOfMemoryError=kill -9 %p"
3
WhiteFang34

Courant en tant qu'option hadoop, je rencontre les mêmes problèmes… .. C'était la réponse:

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

Voici la sortie standard sur le MOO:

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

J'ai aussi essayé:

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

Cela a commencé, mais sur 

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

Mais STDERR a: Sh: kill -9 1164: commande non trouvée

Ceux-ci ne commenceraient même pas:

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

La version entre guillemets devrait fonctionner correctement dans jetée> 9.0.4 maintenant. 

https://bugs.Eclipse.org/bugs/show_bug.cgi?id=408904

3
Thomas Becker

Les oeuvres suivantes

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

La plupart des réponses fournies ne fonctionnent pas. 

Cependant .. si vous voulez le mettre par exemple la variable $ JVM_ARGS dans laquelle vous vivez est un monde de douleur.

1
pveentjer

J'ai trouvé cette option dans un script et je voulais en savoir plus à ce sujet, et Google m'a amené ici. Dans le script en question, l'option est donnée comme

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

Donc, la commande est en double citation, et la valeur de l’option est en simple. Ce n'est pas l'une des formes montrées dans les autres réponses, alors peut-être que ça fera ce que vous voulez?

1
DougC

J'ai même essayé d'incorporer un espace en utilisant% 20 mais cela a été pris à la lettre. Ainsi, lorsqu'il a obtenu un MOO, il a échoué en indiquant que la commande (avec le% 20 incorporé) était introuvable. Fou, je sais, mais ça valait le coup d'essayer ... :)

Peut-être sommes-nous supposés utiliser les mêmes <et> que les documents Sun?! : P je vais l'essayer ... :)

0
Piko

Au lieu d’appeler kill, exécutez un script Shell qui appelle kill avec le pid transmis en tant qu’argument (vous auriez toujours un espace, mais pas de drapeau -9).

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

Si vous ne pouvez toujours pas disposer de l'espace, essayez peut-être de faire en sorte que le script shell trouve le pid associé à cette instance de Jetty? Tout un hack, mais ça pourrait marcher.

0
spadequack

Dans une version récente de Java 8 (mise à jour 92), vous avez maintenant la possibilité d'utiliser l'option "ExitOnOutOfMemoryError".

http://www.Oracle.com/technetwork/Java/javase/8u92-relnotes-2949471.html

0
Carl Chesser

Vous devez utiliser -XX:OnOutOfMemoryError=/bin/kill -9 %p

De plus, si vous souhaitez tester les modifications, vous pouvez faire écho à un message avant de le supprimer.

-XX:OnOutOfMemoryError=/bin/date; /bin/echo custom message;/bin/kill -9 %p

0
Himadri Mandal