27

ある日、通常の作業を数か月行った後、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

4

5 に答える 5

8

クラッシュは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()

于 2011-11-16T14:52:55.487 に答える
5

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

于 2011-11-16T13:36:44.183 に答える
2

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

一般に、JVMのクラッシュを診断するのはかなり困難です。これらは、一部のJNIコードまたはJRE自体のバグが原因で発生する可能性があります。後者が疑われる場合は、Oracleにバグレポートを提出する価値があるかもしれません。

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

于 2011-11-16T13:31:55.010 に答える
1

別のバージョンの 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 はもうクラッシュしません。

于 2014-03-30T07:37:46.283 に答える
1

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

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

于 2011-11-16T13:41:06.847 に答える