gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:23:43 24 4
gpt4 key购买 nike

今天在我的面试中,我被要求编写一个代码来确定在 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<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 方法并递增计数器。我已将其添加到第一个代码示例中。

关于java - Java 中一个类在运行时存在多少个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3478795/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com