2

チーム、

現在利用可能なオブジェクトのアクティブ/強力な参照の数をJavaで知ることは可能ですか?

たとえば、以下のコードでは; クラス A のオブジェクトは、プロジェクト内の多くのクラスで保持できます。しかし、私はそれをモニタースレッドに出力したいと思います。

public class A {
  public static A a = new A();
  public static A getInstance() {
     return a;
  }

  private A() {
     new Monitor(this).start();
  }


  class Monitor extends Thread {
      A refA;
      public Monitor(A ref) {
         this.refA = ref;
      }
      public void run () {

      //TODO Print how many references currently available for Object A referenced by refA;
      //Sure It will be minimum one. (which is "a" in this class A)   
      } 

   }
}

このサンプル プログラムはあまり重要視しないでください。私の質問は、ヒープ/スタック内のオブジェクトに使用できる強力な参照の数を見つける方法です? 唯一の良い点は、そのオブジェクトの強力な参照が 1 つ手元にあることです。

Javaでそれが不可能な場合; この強力な参照を C 言語に渡すことはできますか? そしてC言語から私はそれを行うことができますか?

プロファイラー/ツールがこれをどのように行うことができるのだろうか? 助けてください。

4

3 に答える 3

0

いいえ、VMのクラスツールまたはブランチツールを変更せずに正確な数を取得することはできません(パフォーマンスへの影響のため、本番環境ではほとんど作成できません)。

refパッケージを使用すると、オブジェクトがガベージされようとしている(そしてこの時点で動作している)が、使用可能なカウントがない(VMによって常に処理されるとは限らない)かどうかを通知できます。

于 2012-09-21T10:46:43.257 に答える
0

ヒープダンプを実行して分析し、任意のオブジェクトへの参照の数を見つけることができます。

これを行うためのあなたの要件は何ですか、そしてあなたが望むことを達成するためのより簡単でより良い方法があると私が思うので、あなたはその情報で何をしますか?


WeakHashMapに基づく

/**
 * Reference queue for cleared WeakEntries
 */
private final ReferenceQueue<Connection> queue = new ReferenceQueue<>();

List<WeakReference<Connection>> usedConnections = ....

// when you have a new connection

Connection connection = ....
usedConnections.add(new WeakReference(connection, queue));

// checking the queue for discarded objects.

    // remove null references from usedConnections

    for (Connection x; (x = queue.poll()) != null; ) {
        synchronized (queue) {
           x.close();
        }
     }
于 2012-09-21T10:52:45.237 に答える
-1

このようなものを試すことができます

Class A
{
   static int instanceCount = 0;
   public A()
   {
      instanceCount++;
   }

   protected finalize()
   {
      instanceCount--;
   }

   public static int getInstanceCount()
   {
       return instanceCount;
   }
}

これは、コードを使用してクラスの参照を参照するのに最も近い方法だと思います。それが役に立てば幸い ...

于 2012-09-21T11:28:11.850 に答える