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()