小编典典
我认为反思不会帮助您。有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 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方法并增加计数器。我已将其添加到第一个代码示例中。
2020-10-15