ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server チューニングガイド

7.2.6 Java VM終了時における状態情報のメッセージ出力機能

  特別なメッセージ出力などがないまま、Javaプロセスが予想外の状態で終了してしまった場合の原因の1つとして、Javaアプリケーションが以下のいずれかの処理を実行した場合が考えられます。

  以降は、java.lang.System.exit()(以降、System.exit()と略する)で代表して説明します。

  System.exit()の実行によりJavaアプリケーションが明示的にJavaプロセスを終了させた場合、Java VM側から見ると正常な仕様動作であるため、Java VMとして特別なメッセージ出力などは行いません。このため、ソースがないなど、内部処理動作の詳細が不明なJavaアプリケーションが予想外の状態で終了した場合には、ソース確認などが行えないため、System.exit()が実行されたかどうかを確認することができません。

  このためFJVMでは、Javaプロセス終了時にSystem.exit()が実行されたかどうかを確認可能にするための機能を、「Java VM終了時における状態情報のメッセージ出力機能」として実装しています。
  Java VM終了時における状態情報のメッセージ出力機能は、図1のオプションを指定した場合に有効となります。

1 Java VM終了時における状態情報のメッセージ出力機能を有効にするオプション

-XX:+VMTerminatedMessage

  本機能が有効な場合、JavaプロセスがSystem.exit()の実行で終了した場合には、System.exit()を実行したスレッドのスタックトレース情報などが、図2のような形で標準出力へ出力されます。スタックトレース情報の出力の有無および内容を確認することにより、System.exit()実行の有無を確認することができます。
  なお、標準出力への出力結果は、FJVMのログ情報としてファイルへも格納されます。ファイル名や格納先はJava VM異常終了時のログ出力時と同じです。“7.2.11 FJVMログ”を参照してください。

  そして、本機能が有効な場合で、かつJavaプロセス終了時に図2のようなスタックトレースの情報が出力されなかった場合(「#### JavaVM terminated: …」から始まるメッセージ出力だけの場合)は、System.exit()が使用されず、Javaアプリケーション側の制御論理として終了したと考えられます。
  また、本機能が有効な場合で、かつJavaプロセス終了時に図2のような情報が何も出力されなかった場合は、ネイティブモジュールの中からCランタイムのexit()関数呼び出しによりJavaプロセスが終了したなど、別原因によるJavaプロセスの終了だと考えられます。

2 Java VM終了時における状態情報のメッセージ出力機能による出力例

JDK/JRE 1.4または5.0の場合

Thread dump at JVM_Halt(status code=1234):
"main" prio=5 tid=0x00286240 nid=0x394 runnable [6f000..6fc10]
                        at java.lang.Shutdown.halt(Native Method)
                        at java.lang.Shutdown.exit(Shutdown.java:211)
      - locked <0x16b66d48> (a java.lang.Class)
                        at java.lang.Runtime.exit(Runtime.java:90)
                        at java.lang.System.exit(System.java:715)
                        at JVM_Halt.main(JVM_Halt.java:5)

#### JavaVM terminated: Java HotSpot(TM) Server VM 
(1.5.0_FUJITSU_MODIFIED-B** mixed mode), [pid=21388] TimeMillis=1169451586436 
Time=Mon Jan 22 16:39:46 2007

JDK/JRE 6の場合

Thread dump at JVM_Halt(status code=1234):
"main" prio=3 tid=0x00030000 nid=0x2 runnable [0xfe5ff000..0xfe5ffd80]
   java.lang.Thread.State: RUNNABLE
                        at java.lang.Shutdown.halt0(Native Method)
                        at java.lang.Shutdown.halt(Shutdown.java:105)
        - locked <0xfa81e7d0> (a java.lang.Shutdown$Lock)
                        at java.lang.Shutdown.exit(Shutdown.java:179)
        - locked <0xf3dc8dd8> (a java.lang.Class for java.lang.Shutdown)
                        at java.lang.Runtime.exit(Runtime.java:90)
                        at java.lang.System.exit(System.java:906)
                        at JVM_Halt.main(JVM_Halt.java:5)

#### JavaVM terminated: Java HotSpot(TM) Server VM 
(11.3.02_FUJITSU_MODIFIED-B** mixed mode), [pid=29500] TimeMillis=1243580170483 
Time=Fri May 29 15:56:10 2009

  図2の出力例の場合、JVM_Halt.main()がSystem.exit()を実行し、その結果としてJavaプロセスが終了したことを確認することができます。

  JDK/JRE 6からスタックトレース情報にスレッドの状態を表す情報(トレース情報の前の行)が表示されるようになりました。

  図中の例では「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終了時における状態の判定には使用しません。