web-dev-qa-db-ja.com

ヒープ内のオブジェクトの数を見つける方法

Javaプログラムでヒープ上のライブオブジェクトの数を見つけるにはどうすればよいですか?

20
java_geek

あなたが試すことができるハックがあります:

  • 独自のJava.lang.Objectを作成します(元のソースをコピーします)
  • コンストラクターで作成されたオブジェクトをカウントします(配列では呼び出されません)
  • クラスファイルへのパスをブートクラスパスに追加します

サンプルについては、この(古い) 記事 を参照してください。

おそらく [〜#〜] jpda [〜#〜] または [〜#〜] jmx [〜# 〜] 、しかし私は方法がわかりません...

5

jmapは、ヒープダンプと統計をキャプチャするために使用できる標準のJavaユーティリティです。この情報を取得するためにJVMに接続するためにjmapが使用するプロトコルはわかりませんが、そうではありません。この情報がJVMで直接実行されているプログラムで利用できるかどうかを明確にします(ただし、プログラムはこの情報を取得するために、ソケットを介してJVMにクエリを実行できると確信しています)。

JVM TIは、Cコードで使用されるツールインターフェイスであり、JVMの進行状況にほぼ完全にアクセスできますが、Cコードであり、JVMで直接利用することはできません。おそらくClibを作成して、それとインターフェイスすることもできますが、すぐに使用できるものはありません。

JMX MBeanはいくつかありますが、実際のオブジェクト数を提供するものはないと思います。ただし、これらからメモリ統計を取得できます(これらはJConsoleが使用するものです)。 Java.lang.managementクラスを確認してください。

高速(実装が簡単で、jmapには時間がかかるため、必ずしも迅速な結果とは限りません)が必要な場合は、jmapの実行をフォークして、結果のファイルを読み取るだけです。

12
Will Hartung

jvisualvm を使用して、メモリサンプルを実行します。クラスとインスタンスの数が表示されます。

enter image description here

7
Bin Wang

最も簡単な方法は、jmapツールを使用することです。最後にオブジェクトのヒストグラムを印刷すると、インスタンスの総数とすべてのオブジェクトの累積サイズが表示されます。

jmap -histo <PID>は、インスタンスの数とサイズを含むオブジェクト全体を出力します。最後の行には総数が含まれます

Total 2802946 174459656

2番目の列は合計インスタンス数で、最後の列は合計バイト数です。

7
Jakub Kubrynski

私の知る限り、あなたはできません。ただし、プログラムに使用されているメモリの量を取得することはできます。

 Runtime rt = Runtime.getRuntime();
 System.out.println("Used: " + (rt.totalMemory() - rt.freeMemory());
 System.out.println("Free: " + rt.freeMemory());
 System.out.println("Total: " + rt.totalMemory());
0
Scharrels

すべてのオブジェクトが何らかのFactoryクラスを使用して作成されている場合、ヒープ内のオブジェクトの数を見つけることができます。それでも、finalize()メソッドに何かが必要です。もちろん、これはすべてのオブジェクトに対して実行できるわけではありません。 jdkライブラリクラスは変更できません。ただし、作成した特定のクラスのインスタンスの数を調べたい場合は、それを見つけることができる可能性があります。

0
fastcodejava

デバッグには、プロファイラー(YourKitのような商用Javaプロファイラー)を使用できます。Javaプロファイラーのオープンソースと商用の両方のバリアントがあります。

コードとの統合については、「アスペクト指向プログラミング」手法の使用を検討してください。 AOPフレームワーク(AspectWerkzなど)を使用すると、クラスのロード時にクラスファイルを変更できます。これにより、コンストラクターを変更して、オブジェクトを「all-my-runtime-objects-framework」に登録できます。

0
Melv
public class NumOfObjects {

    static int count=0;
    {
        count++;
    }
    public static void main(String[] args)
    {
        NumOfObjects no1=new NumOfObjects();
        System.out.println("no1:" + count);//1

        NumOfObjects no2=new NumOfObjects();
        System.out.println("no2:"+ count); //2
        for (int i=0; i<10;i++)
        {
            NumOfObjects noi=new NumOfObjects();    
        }
        System.out.println("Total objects:"+count);// 12 
    }
}
0
santhosh