- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 ReferenceQueue 来释放垃圾收集对象使用的资源。问题是我的引用队列始终为空,即使有证据表明引用的对象之一已被垃圾收集。这是一个非常简单、独立的 JUnit 测试,它说明了我正在尝试执行的操作(跟踪对象的删除):
@Test
public void weakReferenceTest() {
ReferenceQueue<Object> refQueue = new ReferenceQueue<Object>();
Object myObject1 = new Object();
Object myObject2 = new Object();
WeakReference<Object> ref1 = new WeakReference<Object>(myObject1, refQueue);
WeakReference<Object> ref2 = new WeakReference<Object>(myObject2, refQueue);
myObject1 = null;
// simulate the application running and calling GC at some point
System.gc();
myObject1 = ref1.get();
myObject2 = ref2.get();
if (myObject1 != null) {
System.out.println("Weak Reference to MyObject1 is still valid.");
fail();
} else {
System.out.println("Weak Reference to MyObject1 has disappeared.");
}
if (myObject2 != null) {
System.out.println("Weak Reference to MyObject2 is still valid.");
} else {
System.out.println("Weak Reference to MyObject2 has disappeared.");
fail();
}
Reference<? extends Object> removedRef = refQueue.poll();
boolean trackedRemoval = false;
while (removedRef != null) {
if (removedRef == ref1) {
System.out.println("Reference Queue reported deletion of MyObject1.");
trackedRemoval = true;
} else if (removedRef == ref2) {
System.out.println("Reference Queue reported deletion of MyObject2.");
fail();
}
removedRef = refQueue.poll();
}
if (trackedRemoval == false) {
fail();
}
}
对我来说,这总是打印:
Weak Reference to MyObject1 has disappeared.
Weak Reference to MyObject2 is still valid.
...这很好,但测试总是失败,因为 trackedRemoval
最后为 false
- ReferenceQueue
始终为空.
我使用的ReferenceQueue
和/或WeakReference
是错误的吗?我也尝试了 PhantomReference,但没有什么区别。
有趣的是,如果将单元测试转换为常规的 public static void main(String[] args)
方法,那么它的工作方式就像一个魅力!
谁能解释一下这种具体行为吗?我长期以来一直在寻找这个问题的答案。
最佳答案
对我来说这似乎是一种竞争条件。当GC确定myObject1
引用的对象是GCable时,它会对其进行GC并将其从WeakReference
中清除。然后,它将将该 WeakReference
添加到“待处理引用列表”中。有一个引用处理程序线程将从该列表中删除并添加到适当的ReferenceQueue
。以上是支持javadoc的实现细节
At the same time or at some later time it will enqueue those newly-cleared weak references that are registered with reference queues.
当您的代码达到
Reference<? extends Object> removedRef = refQueue.poll();
引用处理程序线程不得将您的 WeakReference
添加到 ReferenceQueue
中,因此 poll
返回 null
.
关于java - 为什么ReferenceQueue总是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25998367/
我在查看 WeakHashMap 的源代码时偶然发现了这个: private final ReferenceQueue queue = new ReferenceQueue<>(); private
一个 WeakHashMap与 WeakReference 的工作原理差不多再加上一个 ReferenceQueue - 关于这个的消息为零。这是它应该如何工作的精简示例: public class
编辑 到目前为止,大多数答案都集中在我错误地扩展 map 这一事实上。我已在示例代码中更正了此问题,但类型问题仍然存在,问题仍然存在。 我试图在 Scala 中实现 SoftHashMap,但遇到了类
我知道对于 ReferencesQueue 中的 PhantomReference,必须自己处理并清空 ReferenceQueue。 对于 ReferenceQueue 中的 WeakReferen
我想在其他线程不再引用时正确关闭 Closeable 对象。 我写了一些小测试,但是在对象入队后,get 方法返回 null,即 poll 方法返回正确的没有引用对象的对象。 public sta
这是我的代码 public class FinalizableObject { @Override protected void finalize() throws Throwable
我有一个 PR,一个 PR 指向的对象 O,以及一个为 PR 设置的 RQ。我有一个不断轮询 RQ 的线程,当它在 RQ 中找到第一个引用时,该线程打印它找到它的时间,然后退出。 一切正常,但是当 O
SoftReference 和 WeakReference 真的只有在创建为实例变量时才有帮助吗?在方法范围内使用它们有什么好处吗? 另一大部分是ReferenceQueue。除了能够跟踪哪些引用被确
我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 OOM 时发生,但是如果您完全丢弃引用,GC 会出现并收集 SoftReference 可能会注意到不存在其他强/软引用并
我有一个引用队列,声明为: ReferenceQueue rqueue = new ReferenceQueue<>(); 我有一些软引用以的形式构造 SoftReference ref=new So
我有一个类 ReferenceQueue的 WeakReference class Example { ReferenceQueue> queue = null; Thread cle
这个问题在这里已经有了答案: Does JVM/GC call `finalize()` on program/thread exit? (2 个答案) 关闭 9 年前。 我知道you can't
我正在使用 LWJGL 库,不幸的是,每当我的场景图中的节点需要死亡时,我需要自己释放纹理/vbo 缓冲区,我什至无法使用 finalize() 方法来做到这一点'不保证它将在 opengl 库期望的
我的应用程序并不总是崩溃,只是在我使用它一段时间后,它就会崩溃。 我找到了其他人的解决方案,但他们对我没有帮助。 这是我的墓碑痕迹: signal 11 (SIGSEGV), code 1 (SEGV
我是一名优秀的程序员,十分优秀!