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)   
      } 

   }
}

请不要太重视这个示例程序。我的问题是如何找到堆/堆栈中对象可用的强引用数量?唯一的好处是我们为该对象提供了一个强有力的参考。

如果在 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 回答