Javaヒープダンプを確実に取得する方法


9

OutOfMemoryErrorsによってトリガーされた適切なヒープダンプを取得しようとすると、私のチームは困難に直面しています。特定の理由により、現在、HeapDumpOnOutOfMemoryErrorフラグを使用する代わりに、bashスクリプトから呼び出されたjmapでダンプを取得しています。ヒープサイズが約3 GBの64ビット1.6 JVMを使用しています。ヒープダンプは、90%の確率で失敗します(推定)。

メモリの問題のトラブルシューティングに使用できるクリーンなヒープダンプを取得する確率を向上させるためにできることはありますか?私は、jmapがJava 1.4で大きな問題を抱えていたことを読みましたが、それらの問題の大部分は今対処する必要があります。


4
私はこの質問を「最も意図せずに嫌な音」に指名します。
フェーバス

1
ああ、私はそれを意図的に嫌な音にすることを考えましたが、私はここに新しいので、コミュニティがそれをどのように取るかわかりませんでした:)。
karlcyr 2010

回答:


7

あなたのオペレーティングシステムはどれですか?(コメントを追加できません)。

Solarisの場合、私たちはより良い結果が最初の(コアダンプを強制的に取得gcore <pid>)した後、コアダンプファイル(にjmapのを取り付けますjmap -heap:format=b <path to java bin> <path to core>

gcore実行中のプログラムのイメージを生成する* nixユーティリティです。リンクを参照してください


Linuxのgdbで試してみましたが、うまくいきました。
クリスチャン

どのJDKに「gcore」がありますか?私の、Sun 32ビットjdk for linux 1.6.0.20にはありません。
djangofan

gcoreを明確化して編集。
fglez

2

ManagementFactory.getThreadMXBean()をクエリしてレポートを生成するJSPがあります。アプリがクラッシュした場合は役に立たない可能性がありますが、1分ごとにポーリングすると、何が起こっているかがわかります。

詳細はこちら。


2

外部からjmxを介してアプリケーションを監視できます。今後のOutOfMemoryを示すメトリックがわかっている場合は、例外がスローされる前にjmapの実行をトリガーできます。


ありがとう、jmap-エラーがスローされる前にjmapが信頼できる可能性は高いですか?
karlcyr、2010

jmapは、ヒープダンプを取得するためにまだ時間が必要です。ただし、jvm / tomcatが主な役割を果たしている限り、完全なヒープダンプが得られます。
クリスチャン

これを行うための最もクリーンで簡単なツールは「ビジュアルVM」だと思います。範囲外かもしれませんが、条件を検出してVisualVm内から自動ダンプを取得するVisualVMのカスタムプラグインを作成することは、すばらしいIMHOです。
djangofan 2010

2

ご提案いただきありがとうございます。

私たちがやったことは、ガベージコレクションログをアクティブに監視するスクリプトを書くことです。私たちの経験では、バックツーバックのフルGCはほとんど常にOOMの前にあるため、スクリプトがこのイベントを検出し、サーバーを負荷分散プールから適切に削除し、ヒープダンプを強制します。これにより、効果が大幅に向上しました。


2

これはかなり古い質問ですが、誰かがこれが役立つと思うことを期待して回答します。

jmapには-Fオプション(強制)があります。これは、過去にはうまく機能しないことが証明されています。-Fオプションを使用する場合は、jmapコマンドの一部としてjava.io.tmpディレクトリも指定することをお勧めします。JVMバージョン1.6.22で、一時ディレクトリの設定が原因でjmapユーティリティが正しく機能しないという問題がありました。

gdbを使用してコアダンプを取得することもできます。コアを取得すると、jmapはコアをヒープダンプに変換できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.