如何计算任意类的实例?

时间:2009-12-15 16:42:46

标签: java

给定一个类(例如:foo.bar.MyClass),如何计算JVM中存在的该类的实例数?

由于

编辑:我正在寻找能够检索此计数的代码。

编辑:更具体地说,是方法Integer getInstanceCount(Class c)

的实现

3 个答案:

答案 0 :(得分:5)

根据具体情况,有三种甚至四种可能的答案。他们在这里:

  1. 如果您可以更改课程的源代码,那么您可以添加一个静态计数器(参见@The Feast的答案)

  2. 如果您遇到内存问题,那么您应该使用内存分析器(请参阅@ winSharp93),例如:http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html

  3. 如果您无权访问源代码,则可以向JVM注册一个检测代理程序,该代理程序将该静态字段注入您感兴趣的类(非常简单,但可能)。有关仪器的教程,请访问:http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html

  4. 如果您正在寻找一些公开此信息的Java API,那么 - 遗憾的是 - 答案是不支持此类工具。

答案 1 :(得分:2)

如果您想了解调试/优化原因:查找内存分析器

答案 2 :(得分:1)

您可以使用静态属性来度量虚拟机中的类实例:

static int noOfInstances = 0;

使用以下命令增加构造函数中的每个新实例:

noOfInstances++;

或者使用实例初始值设定项:

{ noOfInstances++; }

最终确定对象时减少。

void finalize() {
    noOfInstances--;
}