大規模なJavaヒープダンプを分析するためのツール


80

分析したいHotSpotJVMヒープダンプがあります。VMはで実行され-Xmx31g、ヒープダンプファイルのサイズは48GBです。

  • jhatヒープメモリの約5倍(私の場合は240 GB)が必要で、非常に遅いので、試してみません。
  • Eclipse MATArrayIndexOutOfBoundsExceptionは、ヒープダンプを数時間分析した後、クラッシュします。

そのタスクに利用できる他のツールは何ですか?ヒープダンプを分析用の効率的なデータ構造に変換する1つのプログラムと、事前に構造化されたデータを処理する他のいくつかのツールで構成される、一連のコマンドラインツールが最適です。


ダンプが破損しておらず、より新しいバージョンのDTFJ JARを使用していることを確認しますか?ArrayIndexOutOfBoundsException少なくとも2つの バグの機能。MATの実行時にOOMEが報告されていないため、これを述べていますこれには別の修正が含まれています
Vineet Reynolds 2011

jhatはheapMapを使用して、読み取られたオブジェクトを格納します。これは、ヒープに格納されているオブジェクトの数とともに指数関数的に増加します。1つのオプションは、declをheapMapからTreeMapに変更し、jhatのヒープサイズを少なくともプロセスと同じ大きさで実行することです。
codeDr 2013年

回答:


80

通常、私が使用するものはEclipse Memory AnalyzerにParseHeapDump.sh含まれており、ここで説明します。これを、より強化されたサーバーの1つに実行します(ダウンロードしてlinux .zipディストリビューションにコピーし、そこで解凍します)。シェルスクリプトは、GUIからヒープを解析するよりも必要なリソースが少なくて済みます。さらに、より多くのリソースを備えた強力なサーバーで実行できます(スクリプトの最後の行の最後になどを追加することで、より多くのリソースを割り当てることができます。たとえば、そのファイルの最後の行は、変更後は次のようになります。-vmargs -Xmx40g -XX:-UseGCOverheadLimit

./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "$@" -vmargs -Xmx40g -XX:-UseGCOverheadLimit

次のように実行します ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof

それが成功した後、それは.hprofファイルの隣にいくつかの「インデックス」ファイルを作成します。

インデックスを作成した後、そこからレポートを生成し、それらのレポートをローカルマシンにコピーして、それだけで原因を見つけることができるかどうかを確認します(レポートだけでなく、インデックスも)。これは、レポートの作成に関するチュートリアルです。

レポートの例:

./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects

その他のレポートオプション:

org.eclipse.mat.api:overview そして org.eclipse.mat.api:top_components

これらのレポートでは不十分で、さらに掘り下げる必要がある場合(つまり、oqlを介して)、インデックスとhprofファイルをローカルマシンにscpしてから、ヒープダンプを開きます(インデックスはと同じディレクトリにあります)。 Eclipse MAT GUIを使用したヒープダンプ)。そこから、実行するのにあまり多くのメモリを必要としません。

編集: 私はちょうど2つのメモを追加するのが好きでした:

  • 私の知る限り、EclipseMATのメモリを大量に消費する部分はインデックスの生成だけです。インデックスを取得した後、EclipseMATからの処理のほとんどはそれほど多くのメモリを必要としません。
  • シェルスクリプトでこれを行うということは、ヘッドレスサーバーでそれを実行できることを意味します(通常、ヘッドレスサーバーでも実行できるので、通常はヘッドレスサーバーでも実行できます)。また、そのサイズのヒープダンプを生成できるサーバーがある場合は、その量のヒープダンプも処理できる別のサーバーがある可能性があります。

4
重要な注意:ParseHeapDump.shOSXバージョンではなくLinuxバージョンのみにパッケージ化されています-eclipse.org/mat/downloads.php
Christopher

これを試してみると(Linuxボックスでbashする)、「GTK +を初期化できません」ですぐに失敗します。したがって、(現在のバージョン、2016-04-15)はまだUI(?)と通信していると考えているようです。
チャールズロス

2
うーん、ParseHeapDump.shの新しいバージョンは、。/ MemoryAnalyzerを直接実行したいと考えています。私はランチャーをjavaで直接実行することを実験していますが、これまでのところ、動作しているようです。 org.eclipse.mat.api.parse "$ @"
Charles Roth

LinuxバージョンとOSXバージョンの両方をダウンロードしてOSXで使用できるようです。次に、ParseHeapDump.shをMemoryAnalyzeファイルと同じディレクトリ(私の場合は〜/ Downloads / mat.app / Contents / MacOS)にコピーし、変更してそこで実行します。または、もちろん、SSH経由でリモートサーバーで実行します:)
rogerdpack 2016年

500MB以下のメモリを使用してEclipseMemory AnalyzerGUIで2GBヒープダンプを開きました。インデックスファイルは、ファイルを開くときにオンザフライで作成されました(約30秒かかりました)。多分彼らはツールを改善しました。それが本当にこのように機能するのであれば、大きなファイルを前後にコピーするよりも便利です。コンソールユーティリティがなくてもメモリフットプリントが小さいことは、私にとって大きなプラスです。しかし、正直なところ、私は本当に大きなダンプ(50 GB以上)では試しませんでした。このツールでこのような大きなダンプを開いて分析するには、どれだけのメモリが必要かが非常に興味深いです。
Ruslan Stelmachenko 2018

6

この関連する質問に対する受け入れられた回答は、あなたにとって良いスタートを提供するはずです(ヒープダンプの代わりにライブjmapヒストグラムを使用します):

大規模なJavaヒープダンプでメモリリークを見つける方法

他のほとんどのヒープアナライザー(私はIBM http://www.alphaworks.ibm.com/tech/heapanalyzerを使用しています)は、優れたGUIツールを期待している場合、ヒープよりも少なくとも一定の割合のRAMを必要とします。

それ以外に、多くの開発者は、ライブスタック分析などの代替アプローチを使用して、何が起こっているのかを把握しています。

なぜあなたのヒープがこんなに大きいのか疑問に思う必要がありますか?割り当てとガベージコレクションへの影響は甚大でなければなりません。ヒープにあるものの大部分は、実際にはデータベース/永続キャッシュなどに保存する必要があると思います。


5

YourKitを試すことをお勧めします。通常、必要なメモリはヒープダンプサイズよりも少し少なくなります(インデックスを作成し、その情報を使用して必要なものを取得します)


4

さらにいくつかのオプション:

この人http://blog.ragozin.info/2015/02/programatic-heapdump-analysis.html

ファイルを実際にメモリにロードするのではなく、ヒープダンプファイルを介して「クエリスタイル」インターフェイスを公開するカスタムNetbeansヒープアナライザを作成しました。

https://github.com/aragozin/jvm-tools/tree/master/hprof-heap

「彼のクエリ言語」が、ここで受け入れられた回答で言及されている日食OQLよりも優れているかどうかはわかりませんが。

JProfiler 8.1(ユーザーライセンスは499ドル)も、多額の費用をかけずに大きなヒープをトラバースできると言われています。


github.com/on-site/fasthatとは異なり、実際には大きなダンプで動作します。いいね!
Jesse Glick 2017年

4

最初のステップ:MATに割り当てるRAMの量を増やします。デフォルトではそれほど多くはなく、大きなファイルを開くことはできません。

MAC(OSX)でMATを使用する場合、MemoryAnalyzer.app / Contents / MacOSにMemoryAnalyzer.iniファイルがあります。そのファイルを調整して「取得」させることは、私にとってはうまくいきませんでした。代わりに、このファイルの内容に基づいて変更された起動コマンド/シェルスクリプトを作成し、そのディレクトリから実行することができます。私の場合、20GBのヒープが必要でした。

./MemoryAnalyzer -vmargs -Xmx20g --XX:-UseGCOverheadLimit ... other params desired

ターミナルを介してContents / MacOSディレクトリからこのコマンド/スクリプトを実行するだけで、より多くのRAMを使用してGUIを起動できます。


ありがとう。今日ユーティリティをDLd。2xクリックで実行しようとしましたが、エラーが発生しました。ログを見て、データファイルを作成できず、スイッチを使用すると言われました。.appパッケージを開き、MemoryAnalyzer.iniが\ MacOSではなくEclipse \フォルダーにあることを確認しました。あはは!そこで、すべてのファイルをローカルで抽出し、提案どおりに実行しました。\ MacOSに.shファイルを作成し、Eclipse \ MemoryAnalyzer.iniのコマンドをフラットな1行としてそのファイルに移動しました。保存されたファイル。コマンドラインでMacOS \から.shファイルを実行すると、動作しました。
マットキャンベル

2

あまり知られていないツール-http: //dr-brenschede.de/bheapsampler/は、大きなヒープに適しています。サンプリングによって機能するため、少し厄介ですが、すべてを読み取る必要はありません。


残念ながら、「一般的な問題:メモリ不足:-Xmxをダンプサイズの2/3に増やしてください」と書かれていますが、十分なRAMがあるか、十分な数のサーバーで実行できる場合は、それで十分かもしれません。 !!
rogerdpack 2016年

2

Eclipse Memory Analyzerの最新のスナップショットビルドには、特定の割合のオブジェクトをランダムに破棄してメモリ消費を削減し、残りのオブジェクトを分析できるようにする機能があります。MATの次のリリースに含まれる前にこの機能をテストするには、バグ563960夜間のスナップショットビルドを参照してください。


1

これはコマンドラインソリューションではありませんが、私はツールが好きです。

ヒープダンプを、それをホストするのに十分な大きさのサーバーにコピーします。元のサーバーを使用できる可能性は非常に高いです。

経由でサーバーに入り、ssh -Xグラフィカルツールをリモートで実行jvisualvmし、Javaバイナリディレクトリからヒープダンプの.hprofファイルをロードします。

このツールは、ヒープダンプ全体を一度にメモリにロードするのではなく、必要に応じてパーツをロードします。もちろん、ファイルを十分に調べれば、必要なメモリは最終的にヒープダンプのサイズに達します。


0

jprofilerを使用してみてください。大きな.hprofの分析に適しています。私は、約22GBのサイズのファイルで試しました。

https://www.ej-technologies.com/products/jprofiler/overview.html

0

JXrayという面白いツールに出くわしました。限定評価トライアルライセンスを提供します。メモリリークを見つけることは非常に便利であることがわかりました。あなたはそれに一撃を与えるかもしれません。

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