2012-01-09 16 views
6

私のアプリケーションは、使用すると思われるよりもはるかに多くのメモリを使用しており、どのクラスが大量のメモリを使用しているのか理解しようとしています。それを解放しないかもしれない。Java VisualVMメモリサンプラー - 特定のクラスのサイズを取得する方法

私はVisualVMを使用しています。メモリサンプラーでは、ほとんどのメモリがChars、Strings、Bytesに費やされていますが、すべてのクラスでStringsを使用していますが、VisualVMがすべての文字と文字列をシステム(すべての文字は文字列と同じですが、文字列を保持する人を理解するのが難しくなります)、 私はこれらの文字列を保持する他のクラスのサイズが文字列なしで計算されることを理解しています。

このツールでは、「実際の」最大のクラス(これらの文字列をすべて保持するクラス)はどのように確認できますか? (できれば私はこれらのクラスから文字列に変換できますが、それ以外の方法ではできません) heapDumpで「最も近いGCへのルート」を使用しようとしましたが、約4,000,000文字列がありますので、 "ものは非常に小さいです...

ありがとう!!!

+0

私は、どのクラスがどのくらいのメモリを使用しているかを明示できないと思います。異なるクラスの別のクラスのオブジェクトをインスタンス化している場合は、どうやってそれについて調べますか?私の知る限りでは、クラスベースの授業利用はできません。 – Johnydep

答えて

2

ヒープダンプを実行すると、20個の最大オブジェクト(参照するすべての領域を含む)が見つかります。何よりも、私は非常に強力なOQLコンソールを使用することをお勧めします。

基本的には、次を探している:

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

私はあなたが、ランダムな文字列を取ることがreferreesだ見つけ、あなたが可能な容疑者を見つけるまで、これを分析し提案します。この容疑者がいたら、http://visualvm.java.net/oqlhelp.html#rsizeofを使ってOQLクエリを実行して、これらのオブジェクトの合計サイズを調べることができます。

+0

ありがとう!私は今これを試してみたい、私はこのメソッドを使用して何かを見つけることを願っています。 – aye

+0

こんにちは、特定の大きなインスタンスを見つけるにはどうすればよいですか?最大の4,000,000文字列しか見ることができませんが、最大の特定のインスタンスを見ることはできません。 – aye

+0

ヒープダンプがあります。クラスビューでは、文字列のバイト数が[%]になっています。これをダブルクリックすると、インスタンスビューに移動します。ここでは、特定のインスタンスを選択し、下部ペインの参照に従います。 – parasietje

2

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

+0

ありがとうございました:) – aye

+0

VisualVMでも同じことができます。 –

関連する問題