特別なメッセージ出力などがないまま、Javaプロセスが予想外の状態で終了してしまった場合の原因の1つとして、Javaアプリケーションが以下のどれかの処理を実行した場合が考えられます。
java.lang.System.exit()を予想外の箇所で実行した
java.lang.Runtime.exit()を予想外の箇所で実行した
java.lang.Runtime.halt()を予想外の箇所で実行した
以降は、java.lang.System.exit()(以降、System.exit()と略する)で代表して説明します。
System.exit()の実行によりJavaアプリケーションが明示的にJavaプロセスを終了させた場合、Java VM側から見ると正常な仕様動作であるため、Java VMとして特別なメッセージ出力などは行いません。このため、ソースがないなど、内部処理動作の詳細が不明なJavaアプリケーションが予想外の状態で終了した場合には、ソース確認などが行えないため、System.exit()が実行されたかどうかを確認することができません。
このためJavaプロセス終了時にSystem.exit()が実行されたかどうかを確認可能にするための機能を、「Java VM終了時における状態情報のメッセージ出力機能」として実装しています。
Java VM終了時における状態情報のメッセージ出力機能は、以下のオプションを指定した場合に有効となります。
-XX:+VMTerminatedMessage |
本機能が有効な場合、JavaプロセスがSystem.exit()の実行で終了した場合には、System.exit()を実行したスレッドのスタックトレース情報などが、以下の出力例のような形で標準出力へ出力されます。スタックトレース情報の出力の有無および内容を確認することにより、System.exit()実行の有無を確認することができます。
そして、本機能が有効な場合で、かつJavaプロセス終了時に以下の出力例のようなスタックトレースの情報が出力されなかった場合(「#### JavaVM terminated: …」から始まるメッセージ出力だけの場合)は、System.exit()が使用されず、Javaアプリケーション側の制御論理として終了したと考えられます。
また、本機能が有効な場合で、かつJavaプロセス終了時に以下の情報が何も出力されなかった場合は、ネイティブモジュールの中からCランタイムのexit()関数呼び出しによりJavaプロセスが終了したなど、別原因によるJavaプロセスの終了だと考えられます。
例
Java VM終了時における状態情報のメッセージ出力機能による出力例
Thread dump at JVM_Halt(status code=0): "main" #1 prio=5 os_prio=0 tid=0x000001f49cd99800 nid=0x23e4 runnable [0x0000001c8b4ff000] java.lang.Thread.State: RUNNABLE at java.lang.Shutdown.halt0(Native Method) at java.lang.Shutdown.halt(Shutdown.java:142) - locked <0x00000000fd6b4398> (a java.lang.Shutdown$Lock) at java.lang.Shutdown.exit(Shutdown.java:217) - locked <0x00000000fd6b4218> (a java.lang.Class for java.lang.Shutdown) at java.lang.Runtime.exit(Runtime.java:109) at java.lang.System.exit(System.java:973) at ExitPattern$1.run(ExitPattern.java:22) at ExitPattern.main(ExitPattern.java:39) #### JavaVM terminated: OpenJDK 64-Bit Server VM (**.***-b** mixed mode), [pid=3108] TimeMillis=1602146316657 Time=Thu Oct 8 17:38:36 2020
参考
スタックトレース情報にスレッドの状態を表す情報(トレース情報の前の行)が表示されます。
出力例では「java.lang.Thread.State: RUNNABLE」となっていますが、"RUNNABLE"の部分が、"NEW"、"TIMED_WAITING (sleeping)"、"WAITING (on object monitor)"、"TIMED_WAITING (on object monitor)"、"WAITING (parking)"、"TIMED_WAITING (parking)"、"BLOCKED (on object monitor)"、"TERMINATED"、"UNKNOWN"などの表示の場合があります。
この情報はJava VM終了時における状態の判定には使用しません。