-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
ラインアウトの桟橋にコメントすると問題なく開始されます。ただし、プロセスがフォールオーバーした場合にシステムがさらに損傷するのを防ぐために、システムでのメモリリークのため、この引数を追加する必要があります。
誰かが私がここで間違っていることや、これをどのように修正できるかについて何か考えがありますか?
Java version 8u92では、VM引数
-XX:+ExitOnOutOfMemoryError
-XX:+CrashOnOutOfMemoryError
追加されました リリースノート をご覧ください。
ExitOnOutOfMemoryError
このオプションを有効にすると、メモリ不足エラーが最初に発生したときにJVMが終了します。メモリ不足エラーを処理するよりも、JVMのインスタンスを再起動したい場合に使用できます。CrashOnOutOfMemoryError
このオプションを有効にすると、メモリ不足エラーが発生すると、JVMがクラッシュし、テキストおよびバイナリのクラッシュファイルが生成されます。
機能拡張リクエスト: JDK-8138745 (ただし、パラメータの命名は間違っています JDK-815471 、ExitOnOutOfMemoryError
の代わりにExitOnOutOfMemory
)
最近、この問題を経験しました。オプションをJava_TOOL_OPTIONS
環境変数に設定することで解決しました。この変数はドキュメント化されています Oracleによって であり、シェル変数でこの変数をexport
する必要があります。JVM
は引数に変数を追加します。
次のように、オプション全体を引用する必要があると思います。
"-XX:OnOutOfMemoryError=kill -9 %p"
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"
単一引用バージョンは、突堤> 9.0.4で正常に動作するはずです。
以下の作品
Java -classpath $CLASSPATH "-XX:OnOutOfMemoryError=touch 'worker.oome'" $JVM_ARGS $MAIN
提供された回答のほとんどが機能しません。
しかし、あなたがそれを例えばに入れたいなら苦痛の世界にいる$ JVM_ARGS変数。
私はスクリプトでこのオプションを見つけ、それについてもっと知りたいと思ったので、グーグルは私をここに連れてきました。問題のスクリプトでは、オプションは次のように指定されています
-XX:OnOutOfMemoryError='"kill -9 %p"'
したがって、コマンドは二重引用符で囲まれ、オプション値は一重引用符で囲まれています。これは他の回答に示されている形式の1つではないので、多分それはあなたが望んでいることをするでしょうか?
%20を使用してスペースを埋め込むことも試みましたが、それは文字通り行われました。そのため、OOMを取得したときに、コマンド(%20が埋め込まれている)が見つからないと言って失敗しました。クレイジー、私は知っているが、試してみる価値があった... :)
たぶん、Sunのドキュメントのように実際の<と>を使用することになっているのでしょうか。 :Pやってみます... :)
正しい構文はquotes( ")をエスケープすることです
-XX:OnOutOfMemoryError=\"kill -9 %p\"
kill
を呼び出す代わりに、pidを引数として渡してkill
を呼び出すシェルスクリプトを実行します(スペースはありますが、-9フラグはありません)。
例えば-XX:OnOutOfMemoryError='/path/killdash9.sh %p'
それでもスペースが足りない場合は、シェルスクリプトにそのJettyインスタンスに関連付けられているpidを見つけさせてみてください。かなりハックですが、うまくいくかもしれません。
Java 8(92更新))の最近のリリースでは、「ExitOnOutOfMemoryError」オプションを使用するオプションがあります。
http://www.Oracle.com/technetwork/Java/javase/8u92-relnotes-2949471.html
-XX:OnOutOfMemoryError=/bin/kill -9 %p
を使用する必要があります
また、変更をテストする場合は、強制終了する前にメッセージをエコーできます。
-XX:OnOutOfMemoryError=/bin/date; /bin/echo custom message;/bin/kill -9 %p