0

クラスがあると言う

class A{
  //code for class A
}


class B{
  //code for class B
}

class A{
  public static void main(String a[]){
    //Initialize m instances of A and n instances of B and store each in arrays
    //Equate any arbit index in the array to null
  }
}

このシナリオでは、私の主な目標は、任意の時点でメモリ内のクラスAおよびBのすべてのアクティブなインスタンスを見つけることです。

デバッガーを使えば可能だと思います。

ただし、何らかの理由(質問の範囲を超えている理由)により、コード自体からインスタンスを取得する必要があります。したがって、私は次のような関数が必要です

public void getAllActiveInstances(){
  //Print values
}

編集:インスタンスを操作する必要はありません。それらが存在するかどうかを知る必要があります。これは主にデバッグを目的としています。これが不可能な場合は、デバッガーを使用して同じことを行う方法を親切に説明してください。

4

3 に答える 3

2

簡単な答えはノーです。Javaでいつでもメモリの内部を見ているべきではありません。

長い答えは、GCがオブジェクトを収集した後にオブジェクトにアクセスする方法があった場合、実行中のコードでは到達できないものだけを収集するというGCの原則に違反しているということです。ガベージコレクションされたメモリは解放され、プログラムに戻されて、必要な処理を実行します。これは、オブジェクトAをGCした場合、Javaはその場所に任意の数の書き込みを許可され、そのメモリブロックの「Aらしさ」を破壊することを意味します。そのメモリブロックに現在格納されているオブジェクトBを読み取ろうとして、それがAであると偽ってみると、あらゆる種類の問題が発生します。

今後:作成したすべてのクラスを追跡するには、クラス自体を変更することをお勧めします。クラスはstatic(のような)コンテナを持つことができHashMap、コンストラクターは構築されたクラスをに追加しHashMapます。ただし、作成したすべてのオブジェクトへの参照にぶら下がっているため、ガベージコレクトがそれらのオブジェクトを収集してそのメモリを解放することはありません。

于 2012-06-11T13:53:58.813 に答える
1

「このシナリオでは、私の主な目標は、ガベージコレクターがオブジェクトを削除したかどうかに関係なく、メモリ内のクラスAとBのすべてのアクティブなインスタンスを見つけることです。」

ガベージコレクターがそれを削除した場合、それはアクティブなインスタンスではなく、実際にはどのような種類のインスタンスでもありません。

このためのJavaAPIはありません。確かに、JRockit Flight Controlやデバッガーでこれを実行できますが、実際にプログラムで実行する方法が必要な場合は、手動でロールする必要があります。それを信頼できるものにして頑張ってください。オブジェクト数を増減するには、コンストラクターとファイナライザーを使用する必要があります。

独自のゲームでホットスポットオプティマイザーを打ち負かすことができると本当に思っている場合を除いて、独自のオブジェクトプールを実装しようとしないでください。

于 2012-06-11T13:56:55.437 に答える
1

あなたが言ったように、あなたはデバッガーを使ってそれをすることができます。JavaはデバッグAPIを提供します。独自のデバッガーを実装して、アプリケーション自体に接続することができます。

他の方法は、クラスをインストルメント化することです。私は次のテクニックを知っています:

  1. 監視する必要のあるすべてのインスタンスへの参照を格納する特別なファクトリを使用して、それらをインスタンス化します。
  2. AOP(AspectJなど)を使用します。アスペクトは、作成されたインスタンスをリポジトリに登録します(上記のとおり)
  3. Javaインストルメンテーションパッケージを使用して、クラスをその場で変更します。SizeOfを見てください-JavaインストルメンテーションAPIを使用する非常に単純なプロジェクトです。問題を学ぶための例としてそれを使用することができます。
于 2012-06-11T14:01:20.937 に答える