2009-12-15 36 views
2

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

感谢

编辑:我在寻找,将检索此计数的代码。

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

+1

乍得,因为你有你正在寻找实现特定的方法,我想知道如果这是一个家庭作业...... – delfuego 2009-12-15 16:59:48

回答

5

根据确切的上下文,有三个甚至四个可能的答案。在这里,他们是:

  1. 如果你可以改变类的源代码,那么你可以如果您遇到内存问题,那么你添加一个静态的计数器(见@The盛宴的答案)

  2. 应使用内存分析器(请参阅@ winSharp93),如:http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html,

  3. 如果您无权访问源代码,则可以向JVM注册Instrumentation代理,该代理将会将该静态字段注入类你感兴趣(不是微不足道的,但可能的)。有关仪器的教程可以在这里找到:http://today.java.net/pub/a/today/2008/04/24/add-logging-at-class-load-time-with-instrumentation.html

  4. 如果您正在寻找一些公开此信息的Java API,那么 - 可悲的是 - 答案是不支持这样的设备。

2

如果你想知道这个调试/优化的原因的实现:寻找一个内存分析器

1

您可以使用一个静态属性在虚拟机内进行测量的类的实例:

static int noOfInstances = 0; 

增量在构造函数中的每个新的实例:

noOfInstances++; 

或使用实例初始化:

{ noOfInstances++; } 

当对象完成时减少。

void finalize() { 
    noOfInstances--; 
} 
+0

不错,但我怀疑OP更感兴趣的是能够统计任何*类的数量,而不是他可以修改的数量。但很好。 – delfuego 2009-12-15 16:54:49

+0

谢谢,是的,我刚刚看过编辑。我不相信没有使用探查器(或某种修改的虚拟机)是可能的。 @Chad,你能否详细说明你是否仅仅在源代码级别的解决方案之后? – Pool 2009-12-15 17:00:28

+0

该实现不是线程安全的。增量/减量不是原子的,变量也不是易变的,所以对所有线程的变化可能不明显。 – McDowell 2009-12-15 17:04:53