2012-01-24 3 views
0

プログラムの実行中にオブジェクトがいつ何回使用されているかを知りたい。そのためにJVMスタックにアクセスする必要がありますか、それを行う別の方法がありますか?JVMスタックアクセス

+0

を助け何がこれを行うことにより、測定しようとしていますか? – casablanca

+0

オブジェクトハッシュで呼び出されたときに、すべてのメソッドとコンストラクタをログに記録できるだけですか? –

答えて

6

これを行うには、プロファイラを使用する必要があります。 YourKitやJProfilerやVisualVMのようなもの。

+0

+1、VisualVMはJDK> = 1.6にバンドルされています – quaylar

1

「オブジェクトが何回使用されているか」とはどういう意味ですか?そのコンストラクタが何回呼び出されていますか?または、オブジェクトのメソッドが何回呼び出されたか? 明確にしてください...

いずれにしても、いくつかの方法があります。

  1. あなたの好きなプロファイラを使用することができ、私はあなたが「トレース」モード(計測を行いモードではなく、サンプリングモード)を使用する必要がありますだと思います。

  2. クラスを再コンパイルすると、次の操作を行うことができるよりもオプションの場合: 言って、あなたには、いくつかのconstuctors持つクラスFooのがあります。

    公共Fooクラス{

    公共のFoo(I int型){

     // some constructor 
    

    }

    公共のFoo(文字列S){// 別のコンストラクタ }

    }

言ってやるが、あなたは

だから、あなたは、静的を使用することができます(つまり、オブジェクトが作成された回数である)あなたのコンストラクタが呼び出された回数を知りたいですデータメンバを作成し、コンストラクタを呼び出すたびにカウントを増やします。このように:

public class Foo { 
    private static int count = 0; 

    public Foo(int i) { 

    // if we're here, the object is being created now: 
    count++; 
    ..... 
    } 
    ... 
} 

は、その後、あなたは 生成されたダンプがお気に入りのプロファイラ再びjhatによって表示または開くことができます(JAVA_HOME/binに置かれjmapので例えば)ヒープのスナップショットを取ることができ、あなたのことができるようになりますオブジェクトの状態を調べることで参照してください。

もちろん、この方法はメソッドの呼び出しにも適用されます。 実際には、同じクラスローダによってオブジェクトが作成されている限り動作します。

3.コードを再コンパイルすることはできませんが、プロファイラを使用したくない場合は、バイトコードを計測して2と同じ効果を得ることができます。ここではAspectJのようなフレームワークを使用すると考えられます。他の多くの...

私はここに、プロファイラが最速の方法だと思い 希望これは