gpt4 book ai didi

Java GC - 有没有办法确定收集了哪些对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:16:50 24 4
gpt4 key购买 nike

我正在尝试使用 -verbosegc 标志来监控我的应用程序中的 gc Activity 。我可以看到有完整和次要的集合,但是有没有办法确定(订阅事件/vm 标志/等等)实际收集了哪些对象?

谢谢!

最佳答案

有关内存中对象的一般信息,我建议您查看 jvisualvm(它位于 JDK 的 bin 文件夹中)。它包含许多有关 VM 在您的程序运行时正在执行的操作的有用信息,包括有关各种对象和内存状态的信息。

如果您想要更具体的内容,可以使用 Wea​​kReferences 和 ReferenceQueues。如果您只对几种类型的对象感兴趣,则此选项可能可行。您可以创建对象的 WeakReference,因为它们是使用公共(public) ReferenceQueue 创建的,然后让另一个线程定期检查 Queue(请注意,队列仅表示对象可访问,而不表示它们实际上已被收集):

static ReferenceQueue<MyObject> MY_QUEUE = new ReferenceQueue<MyObject>();
static class MyReference extends WeakReference<MyObject>{
public final String name;
public MyReference(MyObject o, ReferenceQueue<MyObject> q){
super(o, q);
name = o.toString();
}
}

static{
Thread t = new Thread(){
public void run(){
while(true){
MyReference r = (MyReference)MY_QUEUE.remove();
System.out.println(r.name+" eligible for collection");
}
}
}
t.setDaemon(true);
t.start();
}

public MyObject(){
//normal init...
new MyReference(this, MY_QUEUE);
}

关于Java GC - 有没有办法确定收集了哪些对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2629180/

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