gpt4 book ai didi

java - Finalized 拥有大量内存 4 g 中的 2.5 gig

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

我已经阅读了很多关于终结器如何工作的文章。这是我的理解:如果一个类实现了 finalize 方法,Jvm 将创建一个 Finalizer 实例作为该对象的看门狗。

当 GC 运行时,它会标记要处理的对象并将它们添加到引用队列中,然后终结器线程将从队列中挑选这些对象并执行它们的终结方法。

我的问题是:如何从堆转储中找到因某种原因未完成 finalize 方法并开始堆积引用队列的对象?

引用队列是否按特定顺序排列?

最佳答案

这可能不是您正在寻找的答案,但您是否考虑过使用 PhantomReference 而不是覆盖 finalize()?这是一个 article那就是在谈论它。

基本思想是不建议依赖finalyze() 方法进行事前清理,因为

  • 您无法预测它何时会被调用。
  • 它占用 JVM 的资源。
  • 它可以防止对象被垃圾回收。

PhantomReference 提供了一种更简洁的方法来在垃圾收集器删除对象时触发操作。

Object objectToHandle = new Object();
ReferenceQueue queue = new ReferenceQueue();
PhantomReference reference = new PhantomReference(objectToHandle, queue);

objectToHandle 被垃圾收集器从内存中移除时,它的 reference 将被添加到 queue 中。您可以通过调用 queue.remove() 检测到这一点,然后执行清理操作。

// will block until a reference becomes available
Reference removedRef = queue.remove();
//.. you can now perform clean-up actions

注意:PhantomReference.get() 始终返回 null,因此在对象已从内存中删除后,不可能将其取回。

关于java - Finalized 拥有大量内存 4 g 中的 2.5 gig,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38635614/

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