我认为反思不会帮助您。有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(); }}
这将跟踪曾经创建的实例数量,并且是线程安全的。要了解何时对实例进行垃圾回收,可以使用
PhantomReference和
ReferenceQueue来跟踪收集的实例并减少计数器。
class Myclass { static private final AtomicInteger count = new AtomicInteger(); static private final ReferenceQueue<MyClass> queue = new ReferenceQueue<MyClass>(); { count.getAndIncrement(); new PhantomReference<MyObject>(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方法并增加计数器。我已将其添加到第一个代码示例中。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)