Java (1.6) で実行されている重要なプロセスがあり、シャットダウン フックが登録されています。OOM の問題が発生した場合 (問題の詳細については以下を参照)、プロセスが突然停止し、ログが取得されず、catch(Throable x) が例外をキャッチしていません。
しかし、シャットダウンフックは機能します。したがって、厄介な OOM が原因でプロセスがシャットダウンしようとしていることを知る方法があれば、終了する前に必要な情報をログに記録できます。
これを行う方法はありますか?
OOM について: 私が言ったようにキャッチされないため、何が例外なのかわかりません。でプロセスを開始するため、OOM であることはわかっています。
-XX:+HeapDumpOnOutOfMemoryError
ヒープダンプファイルを取得します。それ以外の場合、例外がキャッチされ、ava.lang.OutOfMemoryError: GC オーバーヘッド制限を超えました。しかし、それが常に当てはまるかどうかはわかりません。
編集:
明確でない場合: OOM はいくつかのシナリオで正当な理由で発生する可能性があるため、防止しようとしているわけではありません。アプリのログ ファイルで明確にしていることを確認したいだけです。
私の質問は次のとおりです。シャットダウンフックにいる間にOOMが原因でプロセスがシャットダウンしていることを確認することは可能ですか?
これをプログラムで同じプロセスから行う必要があります。
今のところ、最善の方法は、最近の日付で process_.hprof の java_pid_pid (私は pid を知っています) のヒープ ダンプ ファイルが存在するかどうかを確認し、OOM があったと推測することです。使用可能なメモリが非常に少ない場合は、Runtime.getRuntime().freeMemory() を試して問題を報告できると思いますが、プロセスがシャットダウンしているときに、すでに多くのメモリが解放されている可能性があります。上がベストだと思います。