web-dev-qa-db-ja.com

-XX:OnOutOfMemoryError = "kill -9%p"問題

-XX:OnOutOfMemoryError="kill -9 %p"コマンドをjvm argsに渡そうとすると問題が発生します。

私はJetty7を使用しており、start.iniファイル内にこれがあります。起動時に以下のエラーが表示されます。これはjre /jre1.6.0_03l64の場合です

開始桟橋:STARTED桟橋火4月26日09:54:26 EDT 2011
認識されないオプション:-9
Java仮想マシンを作成できませんでした。

Start.iniファイルは以下のとおりです。

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

ラインアウトの桟橋にコメントすると問題なく開始されます。ただし、プロセスがフォールオーバーした場合にシステムがさらに損傷するのを防ぐために、システムでのメモリリークのため、この引数を追加する必要があります。

誰かが私がここで間違っていることや、これをどのように修正できるかについて何か考えがありますか?

30
Patrick

Java version 8u92では、VM引数

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

追加されました リリースノート をご覧ください。

ExitOnOutOfMemoryError
このオプションを有効にすると、メモリ不足エラーが最初に発生したときにJVMが終了します。メモリ不足エラーを処理するよりも、JVMのインスタンスを再起動したい場合に使用できます。

CrashOnOutOfMemoryError
このオプションを有効にすると、メモリ不足エラーが発生すると、JVMがクラッシュし、テキストおよびバイナリのクラッシュファイルが生成されます。

機能拡張リクエスト: JDK-8138745 (ただし、パラメータの命名は間違っています JDK-815471ExitOnOutOfMemoryErrorの代わりにExitOnOutOfMemory

18
flavio.donze

最近、この問題を経験しました。オプションをJava_TOOL_OPTIONS環境変数に設定することで解決しました。この変数はドキュメント化されています Oracleによって であり、シェル変数でこの変数をexportする必要があります。JVMは引数に変数を追加します。

3
rscarvalho

次のように、オプション全体を引用する必要があると思います。

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

Hadoopオプションとして実行すると、同じ問題が発生します。これが答えでした:

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

OOMの標準出力は次のとおりです。

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

私も試しました:

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

始まりましたが、OOMでは

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

しかし、STDERRには次のものがあります。sh:kill -9 1164:コマンドが見つかりません

これらは開始しません:

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

単一引用バージョンは、突堤> 9.0.4で正常に動作するはずです。

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

3
Thomas Becker

以下の作品

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

提供された回答のほとんどが機能しません。

しかし、あなたがそれを例えばに入れたいなら苦痛の世界にいる$ JVM_ARGS変数。

1
pveentjer

私はスクリプトでこのオプションを見つけ、それについてもっと知りたいと思ったので、グーグルは私をここに連れてきました。問題のスクリプトでは、オプションは次のように指定されています

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

したがって、コマンドは二重引用符で囲まれ、オプション値は一重引用符で囲まれています。これは他の回答に示されている形式の1つではないので、多分それはあなたが望んでいることをするでしょうか?

1
DougC

%20を使用してスペースを埋め込むことも試みましたが、それは文字通り行われました。そのため、OOMを取得したときに、コマンド(%20が埋め込まれている)が見つからないと言って失敗しました。クレイジー、私は知っているが、試してみる価値があった... :)

たぶん、Sunのドキュメントのように実際の<と>を使用することになっているのでしょうか。 :Pやってみます... :)

0
Piko

正しい構文はquotes( ")をエスケープすることです

-XX:OnOutOfMemoryError=\"kill -9 %p\"
0
ALi Maken

killを呼び出す代わりに、pidを引数として渡してkillを呼び出すシェルスクリプトを実行します(スペースはありますが、-9フラグはありません)。

例えば-XX:OnOutOfMemoryError='/path/killdash9.sh %p'

それでもスペースが足りない場合は、シェルスクリプトにそのJettyインスタンスに関連付けられているpidを見つけさせてみてください。かなりハックですが、うまくいくかもしれません。

0
spadequack

Java 8(92更新))の最近のリリースでは、「ExitOnOutOfMemoryError」オプションを使用するオプションがあります。

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

0
Carl Chesser

-XX:OnOutOfMemoryError=/bin/kill -9 %pを使用する必要があります

また、変更をテストする場合は、強制終了する前にメッセージをエコーできます。

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

0
Himadri Mandal