- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 LWJGL 库,不幸的是,每当我的场景图中的节点需要死亡时,我需要自己释放纹理/vbo 缓冲区,我什至无法使用 finalize() 方法来做到这一点'不保证它将在 opengl 库期望的同一线程中执行。
所以我正在使用 PhantomReferences。在我的场景图节点中,我将其放入构造函数中:
phantomReference = new ScenePhantomReference(this, Game.phantomReferenceQueue);
Game.phantomReferenceList.add(phantomReference);
如您在第二行中所见,我已将 phantomReference 添加到主类的列表中。我的逻辑是,当节点被取消引用时,phantomReference 将不会被垃圾回收,因为主类中仍然有一个引用。
是否需要将其添加到这样的列表中?或者它会从 GC 中幸免(也许 Game.phantomReferenceQueue 保留对它的引用?)。
这个测试起来很麻烦,我可以只删除列表,但 GC 可能只是处理在 phantomReference 之前被监视的对象,并使它看起来像列表是多余的,但实际上不是。我会怀疑任何不同的 VM 实现或版本可能会决定以相反的方式进行。
最佳答案
免责声明:我从未使用过 PhantomReference。
但是,我确实阅读了this article和 this javadoc page , 等等
编辑:再次阅读您的帖子标题。自己回答标题问题:不,因为 PhantomReference 在被 gc'ed 之后进入 ReferenceQueue - 所以根据定义它不能停止被 gc'ed。引用第一个链接:“这种引用的唯一用途 [注意:他的意思是 PhantomReference] 是跟踪它何时被排入 ReferenceQueue,因为那时你知道它指向的对象已经死了”
编辑 #2:我还认为您的代码是错误的,因为您应该按如下方式初始化幻影引用(参见一个简单示例 here):
PhantomReference scenePhantomRef = new PhantomReference(scene, phantomQueue);
scene
是您代码中的 ScenePhantomReference
(即您应该重构您的代码,以便 ScenePhantomReference
是名称,例如 Scene
,您将其实例化为 scene
,然后使用上面的行获取该对象的 PhantomReference
的句柄。
关于java - 位于 ReferenceQueue 中的 PhantomReference 是否会阻止 PhantomReference 被 GC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5174127/
我正在使用 LWJGL 库,不幸的是,每当我的场景图中的节点需要死亡时,我需要自己释放纹理/vbo 缓冲区,我什至无法使用 finalize() 方法来做到这一点'不保证它将在 opengl 库期望的
你能帮我理解 PhantomReference 吗?我知道 PhantomReference 有助于跟踪对象何时从堆中移除,并且在调用 finalize 方法后可以访问。我试图用一些代码弄脏我的手,但
我试图了解 Java 中 PhantomReferences 的工作原理,并为此编写了这个程序。 public static void main(String[] args) throws Inter
来自javadoc : Unlike soft and weak references, phantom references are not automatically cleared by the
Java允许写: new PhantomReference(new Object(), null) 在这种情况下 new Object() 会被收集吗? 据我所知,虚引用是 finalize() 方法
我的问题总结了这一切: 强可达 Java PhantomReference 能否阻止其引用对象的内存被垃圾收集器 (GC) 回收? 详情如下: Callum posted this question也
考虑一个使用 PhantomReferences 来避免终结器的库,同时确保释放一些 JNI 资源。 一种架构涉及引用队列和阻塞在引用队列上执行清理操作的线程。 现在的问题是:如何对这一切进行测试?
假设我创建了一个实现 Closable 的类 MyClass。因此,在 close() 方法中,我将释放一些非常重要的资源。好吧,因为它是非常重要的资源,所以我创建了某种安全网络(如《Effectiv
据我所知,当引用指向的对象被删除时,引用会落入 QueueReference。 这里是一个例子,我正要演示这个,但它不起作用。 if 中的代码从未执行过。这是什么意思。我用错了吗?或者 Garbage
演示代码: import java.lang.ref.PhantomReference; import java.lang.ref.ReferenceQueue; public class Main
关于 PhantomReference 我唯一知道的是, 如果您使用它的 get() 方法,它将始终返回 null 而不是对象。有什么用? 通过使用 PhantomReference,您可以确保对象无
它们都可以用于清理,几乎没有保证,但是 PR 需要更多的线束编码。那么,有两个选择,为什么我必须更喜欢一个而不是另一个? Javadoc 9 describes finalize问题很大,但这并不会自
我一直在阅读这篇关于 PhantomReference https://www.baeldung.com/java-phantom-reference 的文章以及在那里找到的简化示例代码: publi
关于PhantomReference,我唯一知道的是, 如果你使用它的 get() 方法,它总是返回 null 而不是对象。有什么用? 通过使用 PhantomReference,您可以确保对象无法通
Soft 的文档-,Weak - 和PhantomReference都包含类似于以下内容的行(取自 PhantomReference): At that time it will atomically
我有一个共享资源,我想知道有多少其他对象仍在使用该资源。为此,我想使用 PhantomReference。 由于 ReferenceQueue 不跟踪为它们注册的引用(source,“通知”部分),我
这是我的代码 public class FinalizableObject { @Override protected void finalize() throws Throwable
我有一个 PR,一个 PR 指向的对象 O,以及一个为 PR 设置的 RQ。我有一个不断轮询 RQ 的线程,当它在 RQ 中找到第一个引用时,该线程打印它找到它的时间,然后退出。 一切正常,但是当 O
Javadoc 8 PhantomReference 状态: Phantom references are most often used for scheduling pre-mortem clea
正如 Hans Boehm 在 Google I/O '17 演讲“How to Manage Native C++ Memory in Android”中建议我使用 PhantomReference
我是一名优秀的程序员,十分优秀!