java中运行时存在多少个类实例

今天在我的采访中,我被要求编写一个代码来确定一个类在java中运行时退出的实例数。

我告诉他们,我们可以使用reflection。 如果你有这样做的有效方法,请告诉我。

我认为反思不会对你有所帮助。 有JVMTI (以及旧的和现已不存在的JVMPI)可用于分析堆并确定类的当前实例数。

编码的替代方法是向要跟踪实例的类添加计数器:

class Myclass { static private final AtomicInteger count = new AtomicInteger(); { count.getAndIncrement(); } static public int instanceCount() { return count.get(); } // edit: account for serializable private void readObject(ObjectInputStream ois) throws ClassNotFoundException, IOException { counter.getAndIncrement(); ois.defaultReadObject(); } } 

这将跟踪有史以来创建的实例数,并且是线程安全的。 要找出实例何时被垃圾收集,您可以使用PhantomReferenceReferenceQueue来跟踪收集的实例并减少计数器。

 class Myclass { static private final AtomicInteger count = new AtomicInteger(); static private final ReferenceQueue queue = new ReferenceQueue(); { count.getAndIncrement(); new PhantomReference(this, queue); } static public int instanceCount() { return count.get(); } static { Thread t = new Thread() { public void run() { for (;;) { queue.remove(); count.decrementAndGet(); } } }; t.setDaemon(true); t.start(); } } 

编辑:

如果类是可序列化的,请实现readObject方法并递增计数器。 我已将此添加到第一个代码示例中。

如果通过提供访问器方法和provate构造函数(如Singleton模式)来限制实例生成,那么您可以继续计算创建新实例的次数。

我不认为你可以用reflection的任意类做到这一点。 可能他只是希望你添加一个静态计数器字段:

 public class Foo { private static int counter = 0; public Foo() { counter++; } }