ほとんどの場合、エンタープライズ アプリケーションでは、指定された Java ヒープは最大 12 ~ 16 GB の理想的なサイズよりも大きくなります。これらの大きな Java アプリケーションで NetBeans プロファイラーを直接動作させるのは難しいと感じました。
しかし、通常、これは必要ありません。jdk に付属の jmap ユーティリティを使用して「ライブ」ヒープ ダンプを取得できます。つまり、jmap は GC の実行後にヒープをダンプします。アプリケーションで何らかの操作を行い、操作が完了するまで待ってから、別の「ライブ」ヒープ ダンプを取得します。Eclipse MAT などのツールを使用して、ヒープダンプをロードし、ヒストグラムを並べ替え、増加したオブジェクトや最も高いオブジェクトを確認します。これにより手がかりが得られます。
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
このアプローチには 1 つの問題しかありません。巨大なヒープ ダンプは、ライブ オプションを使用しても、開発ラップに転送するには大きすぎる可能性があり、開くには十分なメモリ/RAM を備えたマシンが必要になる場合があります。
そこで、クラス ヒストグラムの出番です。jmap ツールを使用して、ライブ クラス ヒストグラムをダンプできます。これにより、メモリ使用量のクラス ヒストグラムのみが得られます。基本的に、参照をチェーンするための情報はありません。たとえば、char配列を先頭に配置する場合があります。そして、その下のどこかにある String クラス。自分で接続を描画する必要があります。
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
2 つのヒープ ダンプを取得する代わりに、上記のように 2 つのクラス ヒストグラムを取得します。次に、クラス ヒストグラムを比較して、増加しているクラスを確認します。Java クラスをアプリケーション クラスに関連付けることができるかどうかを確認します。これはかなり良いヒントになります。2 つの jmap ヒストグラム ダンプを比較するのに役立つ pythons スクリプトを次に示します。ヒストグラムパーサー.py
最後に、JConolse や VisualVm などのツールは、時間の経過に伴うメモリの増加を確認し、メモリ リークがあるかどうかを確認するために不可欠です。最後に、問題がメモリ リークではなく、高いメモリ使用量である場合もあります。これには、GC ロギングを有効にします。G1GC などのより高度で新しい圧縮 GC を使用します。また、jstat などの jdk ツールを使用して、GC の動作をライブで確認できます。
jstat -gccause pid <optional time interval>
-jhat、jmap、フル GC、Humongous 割り当て、G1GC についての Google へのその他の参照