JavaVMクラッシュに伴う異常終了

WebOTX が異常終了した際、 ${INSTANCE_ROOT}/config ディレクトリ配下に hs_err_pid{プロセスID}.log という JVM がクラッシュしたことを示すログファイルが生成されることがあります。また、Standardを利用している場合は、 ${INSTALL_ROOT}/Trnsv/bin 配下にも同様のファイルが生成されることがあります。これは大抵の場合、次のような原因が挙げられます。

この時、WebOTX が異常終了した時刻とほぼ同一のタイムスタンプを持つクラッシュファイルが存在する場合は、そのファイルの内容を基にクラッシュ発生の原因を特定し、解決手段を見つける必要があります。

以下に、本ファイルの出力内容における確認ポイント、および幾つかの代表的なケースでの対処例について示します。

異常終了の原因

利用する JVM バージョンやベンダーにより多少出力内容は異なりますが、ファイル内の先頭行には、次のようなメッセージが出力されています。

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x080451c7, pid=708, tid=3744
#
# Java VM: Java HotSpot(TM) Server VM (1.7.2_ ....)
# Problematic frame: (4)
# V [jvm.dll+0x451e7]

主に注目すべき内容を下線で示しています。それぞれの意味は次の通りです。

シグナルまたはエラー(EXCEPTION_ACCESS_VIOLATION)を発生させたのは、プロセスID(pid=708)で示されたスレッド(tid=3744)であり、さ らにそのスレッドにおいて当時実行されていたプログラムは(V [jvm.dll+0x451e7])であったことを示しています。

の具体的なスレッドについての情報は、上記出力例のすぐ下に、次のような形式で出力されています。

--------------- T H R E A D ---------------
Current thread (0x00f20400): JavaThread “main” [_thread_in_vm, id=3744]

この場合、スレッド(tid=3744)は main という名前を持つ Java スレッドであったことを示しています。

すなわち、この main スレッドの実行中に(V [jvm.dll+0x451e7])で示された jvm.dll という JVM が使用するライブラリが参照されており、その中で致命的なエラーが発生してクラッシュしたことになります。

以上のようにして本ファイルの内容を読み解くことで、クラッシュ発生当時の状況の概要を理解することができます。

対処方法

クラッシュ発生当時の状況を把握した上で、次にクラッシュ発生の原因を突き止める必要があります。

この時、先に示したクラッシュ発生当時の情報を基に調査を進めることになりますが、UNIX 系 OS の場合は通常クラッシュファイルの出力先に core ファイルも同時に出力されていますので、gdb ツールによって core ファイルを読み込ませて解析することで、さらにエラー発生当時のプロセス内部の具体的な動作状況を知ることができます。

まずは、クラッシュしたプログラムがJavaVM 内か、アプリケーションが利用しているライブラリであるかを切り分ける必要があります。

クラッシュしたプログラムがJavaVM 内のプログラムであった場合は、これらの解析結果を基に、まずはJavaVMを提供しているベンダーの公式サイトにて、同様のクラッシュ発生要因が JVM の不具合として掲載されていないか、あるいはその不具合が改修されていないかどうかを確認します。

クラッシュしたプログラムがアプリケーションが利用しているライブラリであった場合は、そのライブラリの開発元に確認をしてください。


関連情報