私のJavaアプリケーションは、SIGSEGVとスタック・データのダンプと情報のロードをテキスト・ファイルに定期的にクラッシュさせ始めました。コード実行時にJVMで発生するSegfaultsをどのようにデバッグできますか?
gdbでCプログラムをデバッグしました。私はIDEからJavaコードをデバッグしました。実行中のJavaプログラムでCのようなクラッシュに近づく方法がわかりません。
私はここでJVMバグを見ていないと仮定しています。他のJavaプログラムもうまく動作し、SunのJVMはおそらく自分のコードよりも安定しています。しかし、私はどのようにJavaコードでsegfaultsを引き起こすことができるかわかりません。利用可能なメモリは十分です。最後にプロファイラをチェックインしたとき、ヒープの使用率は約50%で、時折スパイクが約80%でした。調査できるスタートアップパラメータはありますか?このようなバグに近づくと良いチェックリストは何ですか?
イベントを確実に再現できるわけではありませんが、ランダムでも完全に発生するとは思われません。したがって、テストは完全に不可能ではありません。
ETA:血みどろの詳細
の一部は(私はまだ、私はすでに収集いくつかの情報があります実際の問題は非常に特異的である可能性があるため、一般的なアプローチを探していますし、それがであってもよいですいくつかの値。)
はしばらく前に、私は(詳細はhereを参照してください)私のCIサーバをアップグレードした後に類似に見えるトラブルがあったが、-XX:MaxPermSize
を設定している修正は()この時間を助けていません。
さらに調査したところ、クラッシュログファイルでは、「現在のスレッド」とマークされたスレッドは決して私のものではなく、「VMThread」または「GCTaskThread」のいずれかであることが判明しました。コメントが "(終了)"とマークされている場合、前者の場合、GCTaskThreadはリストにありません。これは、問題がGC操作の終わりを過ぎている可能性があると思います。
スタックトレースを取得できますか?それは同じ場所でSEGVですか?私たちはより多くの情報を取り組むことができますか? –
アプリケーションにネイティブコードがありますか? JVMがバイトコードのコレクションを許可している場合、バイトコードがどのようにバグであっても、segfaultを引き起こすには、実際にJVM(またはJRE)のバグを見つけてください。 –
@Ed - スタックトレースはたくさんありますが、巨大なテキストの壁です。投稿するのに最も役立つ部分は何ですか?私は主にこのタイプの問題にアプローチする一般的な方法を探しているので、ここでは非常に具体的な情報を読み込むことを躊躇しています。 –