.hprofファイルを分析するにはどうすればよいですか?


227

次のフラグを使用して運用サーバーを実行しています:-XX:+ HeapDumpOnOutOfMemoryError

昨夜、サーバーでヒープエラーが発生したときにjava-38942.hprofファイルが生成されました。システムの開発者はフラグを知っていましたが、フラグから有用な情報を取得する方法がないことがわかりました。

何か案は?

回答:


215

かなり高度なツールを使用して真剣な取り組みを行う場合は、SAPから提供されたEclipseのMemory Analyzerプロジェクトをご覧ください。

あなたができることのいくつかは、メモリリークなどを見つけるのに驚くほど良いことです-インメモリオブジェクトに対して制限されたSQL(OQL)のフォームを実行することを含みます。

SELECT toString(firstName)FROM com.yourcompany.somepackage.User

完全に素晴らしい。


18
Eclipse Memory Analyzerに+100を追加したいだけです。私は現在400mb +のヒープダンプファイルを通してふるいにかけようとしています、そしてそれが完全なJVMクラッシュを引き起こす前にjhatがファイルを読むのに70分以上かかりました。EMAは5分未満で開くことができます。
matt b

3
Eclipse Memory Analyzerを使用してHPROFファイルを開くと、解析エラーが発生し続けます(実際にはEclipseによってダンプされました)。残念です。ため息。
lost_bits1110

3
MATはまだかなりのRAMを必要とする可能性があります[JHATより少ないですが、それでもかなりの量]。この問題が発生した場合のヒントについては、stackoverflow.com / questions / 7254017 / …を参照してください。
rogerdpack 2015年

71

JDKでデフォルトで提供されるJavaヒープ分析ツールであるJHATを使用できます。コマンドラインですが、メモリの調査に使用するWebサーバー/ブラウザーを起動します。ユーザーフレンドリーではありませんが、少なくとも、ほとんどの場所にすでにインストールされています。非常に便利なビューは、一番下にある「ヒープヒストグラム」リンクです。

例: jhat -port 7401 -J-Xmx4G dump.hprof

jhat OQLを「今日」実行することもできます(下部リンク「OQLを実行」)


上記のコマンドを実行すると、コンソールでターミナル「サーバーの準備ができました」にメッセージが表示されます。ポート:7401。その後、次のURLを開きます: localhost:7401「ブラウザウィンドウで詳細を確認できます」。
Laxman G

35

Netbeans ProfilerまたはVisual VMからHeapWalkerを使用することもできますスタンドアロンツールます。ビジュアルVMはスタンドアロンであるため、JHATの優れた代替手段ですが、JHATよりもはるかに使いやすいです。

Visual VMを完全に使用するには、Java 6以降が必要です。


これはJava 6および7の場合のみであることに注意してください。
Nick Stinemates 2008年

AFAIK、HeapWalker、およびVisualVMは、HPROFファイルを読み取るためにJava 6/7を必要としません。
James Schek、2008年

Java 5でロードしようとしたところ、「Java 6または7を使用してください」と表示されました。
Nick Stinemates 2008年

うーん。おそらく、Java 6を実行する必要がありますが、Java 5 HPROFを読み取ることができます(たぶん、私はそれを機能させました)。Java 5を実行しているアプリでVisual VMからヒープダンプを作成できないことを知っています。
James Schek、2008年

また、Java SDKから、視覚的なJVMを使用することができます-見てのためjvisualvm.exeJAVASDK/binフォルダ
xxxvodnikxxx

11

Eclipse Memory Analyzerを入手してください。そこに良いものは何もありません、それは無料です。

JHATは「おもちゃのアプリケーション」でのみ使用できます


3
JHATは、LILOからBSDディストリビューションを手動でビルドする「l33t」ハッカーを感動させるために必要です。待ってください...彼らはとにかくjavaを使うことは決してないでしょう。:-)
James Schek、2008年

これはもっとコメントだと思います...:\
rogerdpack '28 / 11/17


5

heapdumpのカスタム分析を行う場合は、次の方法があります。

このライブラリは高速ですが、Javaで分析コードを記述する必要があります。

ドキュメントから:

  • ヒープダンプを処理するためにディスク上に一時ファイルを作成しません
  • GZ圧縮ヒープダンプを直接処理できます
  • HeapPath表記

2

私はVisualVMを好みます。VisualVMで気に入っている機能の1つは、ヒープダンプの比較です。ヒープダンプ分析を行っている場合、クラッシュの原因を突き止めるにはさまざまな方法があります。私が便利だと思った方法の1つは、正常なヒープダンプと異常なヒープダンプを比較することです。

以下は、そのために実行できる手順です。

  1. OutOfMemoryErrorのヒープダンプを取得するには、「oome.hprof」と呼びましょう。これは、JVMパラメータHeapDumpOnOutOfMemoryErrorを介して取得できます。
  2. アプリケーションを再起動して、アプリケーションに応じて大きな時間(分/時間)実行します。アプリケーションの実行中に別のヒープダンプを取得します。それを「healthy.hprof」と呼びましょう。
  3. これらの両方のダンプをVisualVMで開いて、ヒープダンプの比較を行うことができます。クラスまたはパッケージレベルで実行できます。これは多くの場合、問題の方向性を示します。

リンク:https : //visualvm.github.io

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