ほとんどの場合、エンタープライズアプリケーションでは、指定された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ヒストグラムダンプを比較するのに役立つpythonスクリプトを次に示します。histogramparser.py
最後に、JConolseやVisualVmなどのツールは、時間の経過に伴うメモリの増加を確認し、メモリリークがないかどうかを確認するために不可欠です。最後に、あなたの問題はメモリリークではないかもしれませんが、メモリ使用量が高いかもしれません。これのために、GCロギングを有効にします。そして、jstatなどのjdkツールを使用して、GCの動作をライブで確認できます。
jstat -gccause pid <optional time interval>
-jhat、jmap、フルGC、Humongous割り当て、G1GCに関するその他のGoogleへの参照