JVM クラッシュの原因を調査するにはどうすればいいですか? 質問する

JVM クラッシュの原因を調査するにはどうすればいいですか? 質問する

数か月間正常に動作した後、ある日、Java アプリが次のエラーで時々クラッシュし始めました。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (safepoint.cpp:247), pid=2075, tid=140042095163136
#  guarantee(PageArmed == 0) failed: invariant
#
# JRE version: 6.0_23-b05
# Java VM: Java HotSpot(TM) 64-Bit Server VM (19.0-b09 mixed mode linux-amd64 compressed oops)
# An error report file with more information is saved as:
# /var/chat/jSocketer/build/hs_err_pid2075.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
#

hs_err_pid2075.log を調べたところ、ネットワーク通信を処理するアクティブなスレッドがあることがわかりました。ただし、過去数か月間にアプリケーションや環境の変更は行われていません。また、負荷の増加もありませんでした。クラッシュの原因を理解するにはどうすればよいでしょうか? JVM クラッシュを調査するための一般的な手順はありますか?

上院http://www.wuala.com/ubear/public より

ベストアンサー1

クラッシュは外部のネイティブ コードではなく、JVM で発生しています。ただし、クラッシュの原因となった操作は外部 DLL によって開始されています。

hs_err_pid ファイルのこの行は、クラッシュした操作について説明しています。

VM_Operation (0x00007f5e16e35450): GetAllStackTraces, mode: safepoint, requested by thread 0x0000000040796000

現在、スレッド0x0000000040796000は

0x0000000040796000 JavaThread "YJPAgent-Telemetry" daemon [_thread_blocked, id=2115, stack(0x00007f5e16d36000,0x00007f5e16e37000)]

これは Yourkit によって作成されたスレッドです。「GetAllStackTraces」は、プロファイラーがサンプリングを行うために呼び出す必要があるものです。プロファイラーを削除すると、クラッシュは発生しません。

この情報からクラッシュの原因を特定することはできませんが、次の操作を試すことができます: すべての -XX VM パラメータ、-verbose:gc、およびデバッグ VM パラメータを削除します。これらは、JVM のプロファイリング インターフェイスに干渉する可能性があります。

アップデート

java.lang.Thread#getAllStackTraces()同じクラッシュを呼び出すか、java.lang.Thread#getStackTrace()同じクラッシュを引き起こす可能性のあるコード

おすすめ記事