java 运行单个类_Java中在运行时存在一个类的多少个实例

小编典典

我认为反思不会帮助您。有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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值