7

私のアプリケーションは、使用すると思われるよりも多くのメモリを使用しています。どのクラスが大量のメモリを使用しているかを理解しようとしており、メモリを解放していない可能性があります。

私は VisualVM を使用しており、メモリ サンプラーでは、ほとんどのメモリが Char、String、および Byte に費やされていることがわかります。私のクラスはすべて String を使用していますが、ご存知のように、VisualVM はシステム内のすべての Char と String を示しています (すべてのこれらの文字列を保持する他のクラスのサイズは文字列なしで計算されることを理解しているため、文字は文字列と同じであるため、誰がそれらを保持しているかを理解するのが難しくなります)。

このツールで、「実際の」最大のクラス (これらすべての文字列を保持するクラス) を確認するにはどうすればよいですか? (できれば、これらのクラスから文字列に到達でき、その逆ではない場合)heapDumpで「最も近いGCへのルート」を使用しようとしましたが、約4,000,000の文字列があるため、「問題のある」を見つける可能性がありますものはとても小さいです...

ありがとう!!!

4

2 に答える 2

2

ヒープダンプを実行すると、最大20個のオブジェクト(参照するすべてのスペースを含む)を見つけることができます。それ以上に、非常に強力なOQLコンソールを使用することをお勧めします。

基本的に、あなたは以下を探しています:

Lot of String's taking up 20Mb 
   --- kept alive by --->
HashSet#28839 
   --- kept alive by --->
MyOwnClass#88293

ランダムな文字列を取得し、それが参照先であることを見つけて、容疑者が見つかるまでこれを分析することをお勧めします。この容疑者が見つかったら、http: //visualvm.java.net/oqlhelp.html#rsizeofを使用してOQLクエリを実行し、これらのオブジェクトの合計サイズを確認できます。

于 2012-01-09T14:17:04.377 に答える
2

ヒープ ダンプを作成し、MATで開き、ヒストグラムで最大の保持サイズを調べます。

于 2012-01-09T16:25:37.420 に答える