web-dev-qa-db-ja.com

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

1日前、数か月の通常の作業の後、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のクラッシュを調査するための一般的な手順はありますか?

UPD http://www.wuala.com/ubear/public

27

クラッシュは、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()を呼び出すコードは、同じクラッシュを引き起こす可能性があります

8
Ingo Kegel

繰り返し発生するJVMクラッシュを2回目撃したのは、どちらもハードウェア障害、つまりRAMが原因でした。 memtestユーティリティー を実行することが、私が最初に試みることです。

5

YourKit エージェントがロードされていることがエラーレポートからわかります。そのテレメトリスレッドは、失敗したように見える操作のリクエスターとして言及されています。 YJPエージェント なしでアプリケーションを実行してみて、クラッシュを再現できるかどうかを確認してください。

一般に、JVMのクラッシュは診断がかなり困難です。一部のJNIコードまたはJRE自体のバグが原因で発生する可能性があります。後者の疑いがある場合は、バグレポートをOracleに送信することをお勧めします。

いずれにせよ、私は Java 6 の最新リリース)にアップグレードして、すでに修正されている既知の問題ではないことを確認することをお勧めします。この時点で現在のリリースを書くことはJava 6 update 29です。

2
NPE

これを直接引き起こすものをいじっていない場合(つまり、基本的にネイティブコードまたはネイティブコードを呼び出すライブラリを使用することを意味します)、ほとんどの場合、JVMまたはハードウェアの問題のバグです。

古くから問題なく動作していて、今はクラッシュし始めている場合、ハードウェアの問題が2つのうち最も可能性が高いようです。別のマシンで実行して問題を除外できますか?もちろん、最新のJavaアップデートにアップグレードしても問題ありません。

1
Michael Berry

Linux-kernelの別のバージョンへの切り替えは、JVMクラッシュの問題を「修正」します( http://forum.proxmox.com/threads/6998-Best-strategy-to-handle-strange-JVM-errors-inside- VPS?p = 40286#post40286 )。それは私の実際のサーバーで私を助けました。カーネル2.6.32-33バージョンのUbuntuサーバー10.04 LTS OSがそこにありました。したがって、カーネルの更新によりこの問題は解決されました。 JVMはもうクラッシュしていません。

1