如何在运行时查找堆/堆栈中对象的强引用数

时间:2012-09-21 10:43:54

标签: java c garbage-collection heap-memory

在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语言我能做到吗?

我只是想知道Profilers /工具是如何做到这一点的? 请帮忙。

3 个答案:

答案 0 :(得分:0)

如果不改变VM上的类或分支工具(由于对性能的影响,很难在生产中制作),你不能得到确切的计数。

使用the ref package,如果某个对象即将被接收(并在此时执行),则会通知您,但是没有可用的计数(并且不总是由VM处理)。

答案 1 :(得分: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();
        }
     }

答案 2 :(得分:-1)

你可以试试这样的东西

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

   protected finalize()
   {
      instanceCount--;
   }

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

我相信这是您可以使用代码包含类的引用的最接近的。希望它有所帮助...