通常、私が使用するものは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からの処理のほとんどはそれほど多くのメモリを必要としません。
- シェルスクリプトでこれを行うということは、ヘッドレスサーバーでそれを実行できることを意味します(通常、ヘッドレスサーバーでも実行できるので、通常はヘッドレスサーバーでも実行できます)。また、そのサイズのヒープダンプを生成できるサーバーがある場合は、その量のヒープダンプも処理できる別のサーバーがある可能性があります。
ArrayIndexOutOfBoundsException
少なくとも2つの バグの機能。MATの実行時にOOMEが報告されていないため、これを述べています。これには別の修正が含まれています。