3

問題のシナリオ:問題はsonic MFコンテナー(jvm)で確認されます。コンテナーは、db操作とメッセージ変換を担当するいくつかのJavaサービスをホストしています。開始されると、コンテナーは2〜3週間正常に実行され、スローせずに自動的に終了します。例外。

多くの調査の結果、jvm(MFコンテナー)がシャットダウンした理由または原因を特定できません。

jvmが自動的にダウンしたときにスレッドダンプを取得する方法はありますか?私はJava1.6を使用しています。私が従うべきこの問題への他のアプローチはありますか?

前もって感謝します。

4

2 に答える 2

5

java.lang.Runtime.addShutdownHook()を試して、フックですべてのスレッドを反復処理し、Thread.getAllStackTraces()を使用してスタックトレースをダンプすることができます。ただし、それまでにJVMがシャットダウンされたRuntime.halt()場合、フックは呼び出されません。より複雑なのは、インストルメンテーションRuntime.exit()を使用してとへの呼び出しにフックすることですRuntime.halt()(またはShutdown.sequence()、編集#2を参照)。これにより、どちらかが呼び出されたときに何が起こっているかを正確に確認できます。

編集:それを行う別の方法は、セキュリティを強制しないが、呼び出されるたびにスレッドのリストをダンプするSecurityManagerをインストールすることです。これSecurityManager.checkExit()は、両方ともそのセキュリティマネージャーメソッドhalt()を呼び出すためです。exit()これは、インストルメンテーションを使用するよりもはるかに簡単であり、スレッドの実行内容をログに記録するだけでなく、例外をスローすることもできます。

編集2:JVMが実行されているシステムは、JVMに終了を指示できます。その場合、セキュリティマネージャーの使用は機能しません。呼び出されるメソッドは。であるため、Runtime.exit()またはでインストルメンテーションを使用することもありません。そして、最後のデーモンスレッドが終了したためにJVMがシャットダウンしている場合は、JVMが呼び出されます。ただし、シャットダウンフックこれらの状況のいずれでも機能します。したがって、セキュリティマネージャやインストルメンテーションも使用する場合でも、常にシャットダウンフックを使用する必要があります。Runtime.halt()java.lang.Shutdown.exit()Shutdown.shutdown()

于 2012-05-23T07:17:13.647 に答える