问题标签 [phantom-reference]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 为什么 PhantomReference 不起作用?
演示代码:
我测试了代码,但它总是死循环。代码 (System.out.println(1111111);) 无法执行,q.poll() reurn null。
我认为如果测试对象被 GC 删除,q.poll() 将返回 p 对象,然后中断循环,但调用此演示代码,这与我的想法不同
编辑:我修改了演示代码,它现在可以工作了。
正如某人所说,语句(test = null)是key.GC收集分配null的测试对象。
java - 当 PhantomReference/SoftReference/WeakReference 排队时,你怎么知道它指的是什么?
我没有使用 PhantomReferences。实际使用的好例子似乎很少。
当一个幻影出现在您的队列中时,您如何知道它是/曾经是哪个对象?get() 方法似乎没用。根据JavaDoc,
因为幻影引用的所指对象始终不可访问,所以此方法始终返回 null。
我认为,除非您的对象是单例,否则您总是希望使用 PhantomReference 的子类,您可以在其中放置您需要的任何纪念品,以了解死亡的原因。
这是正确的,还是我错过了什么?
这对于 SoftReferences 也是如此吗?对于弱引用?
指向相关使用示例的链接会很棒。
java - 一旦 GC 决定它无法访问,有没有办法回收一个复杂的 java 对象
在 C++ 中,我使用引用计数对象来实现一个“自动”回收对象池
-- 现在我在 C++ 对象上有一个“onFinalRelease()”方法,当 refcount 达到 0 时会调用该方法。我可以覆盖它(默认为 delete(this))以自动回收对象而不是销毁它们。
问题是我是否可以使用 java 引用类型和引用池的某种组合来实现这种模式。当然,这是针对一种在有意义的情况下创建对象成本高昂的大型复合体。那就是我想做的:
这将是真正的好:)
java - Java:强/软/弱/幻引用之间的区别
我已经阅读了这篇关于 Java 中不同类型的引用(强、软、弱、幻)的文章,但我并不真正理解它。
这些引用类型之间有什么区别,每种类型何时使用?
java - 何时在 Java 中使用幻像引用?
我已经阅读了不同类型的参考资料。我了解强引用、软引用和弱引用的工作原理。
但是当我读到幻影引用时,我并不能真正理解它们。也许是因为我找不到任何好的例子来告诉我它们的目的是什么或何时使用它们。
你能告诉我一些使用幻像引用的代码示例吗?
java - Java:PhantomReference 的实际使用?
PhantomReference 的实际用途是什么?由于他们的'get'总是返回null,他们指向的对象不能通过他们访问。那么它们有什么用呢?也许是通过子类化(类似于 WeakReference 在 WeakHashMap 中的子类化方式)?
java - 何时在 Java 中使用 Weak 和 Phantom 引用
我阅读了很多文章,但我不明白 - 在实践中我需要在哪里使用 Weak 和 Phantom 引用?据我了解,软引用 - 是缓存的不错选择。但是虚弱又虚幻,不知道什么时候用。请提供我们需要使用它们的实际任务的示例。
java - Java:PhantomReference、ReferenceQueue 和 finalize
我有一个 PR,一个 PR 指向的对象 O,以及一个为 PR 设置的 RQ。我有一个线程不断轮询 RQ,并且在它在 RQ 中找到的第一个引用时,线程打印它找到它的时间,然后退出。
一切正常,但是当 O 完成最终确定(无论多么微不足道)时,线程不再在 RQ 中找到引用并无限期地继续运行。
问题:为什么会这样?我正在使用 Sun JDK 1.6。
这是代码:
good case
bad case
只需取消注释 中的 SOPfinalize()
即可GCPhantomObject
。
java - 为什么我的对象不会死?
我正在尝试实现一种机制,当保存它们的对象死亡时删除缓存文件,并决定使用PhantomReference
s 来获得有关对象垃圾收集的通知。问题是我不断遇到ReferenceQueue
. 当我更改代码中的某些内容时,它突然不再获取对象。所以我尝试制作这个示例进行测试,并遇到了同样的问题:
输出是:
不用说,更改时间,多次sleep
调用等都不起作用。gc
更新
正如建议的那样,我打电话Reference.enqueue()
给我的参考资料,这解决了这个问题。
奇怪的是,我有一些可以完美运行的代码(刚刚测试过),尽管它从不调用enqueue
. 是否有可能将参考Reference
放入一个Map
神奇的队列中?
一些过滤后的输出:
2013-08-05 22:35:01,932 调试将图像保存到文件:<>\AppData\Local\Temp\tmp7..0.PNG
2013-08-05 22:35:03,379 调试删除未使用的文件:<>\AppData\Local\Temp\tmp7..0.PNG 创建于 2013 年 8 月 5 日星期一 22:35:02 IDT
java - 在使用 PhantomReferences 完成时,我会避免使用反射吗?
假设我创建了一个实现 Closable 的类 MyClass。所以在 close() 方法中,我将释放一些非常重要的资源。好吧,因为它是非常重要的资源,所以我创建了某种安全网络(如 Effective Java 中推荐的那样)。这里是:
一开始我很高兴,但后来我读到终结器并不那么酷,而且有一个像 PhantomReference 这样很酷的工具。所以我决定更改我的代码以使用 PhantomReference 而不是 finalize() 方法。我创建了 CustomPantom 扩展了 PhantomRefernce。这里是:
因此,正如我所见,我可以获得对我的对象的引用的唯一方法是使用反射并从 Reference 类中的引用字段中获取 if。这是从清理方法调用 MyClass.close() 的唯一方法吗?
PS我没有在这里发布所有代码,但我测试了它并且一切正常。ReferenceQueue由PhantomReferences填充,然后我可以一一获取并调用清理方法。但是我看不到如何在不使用反射的情况下解决上述问题。