gpt4 book ai didi

java - 位于 ReferenceQueue 中的 PhantomReference 是否会阻止 PhantomReference 被 GC?

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:36 26 4
gpt4 key购买 nike

我正在使用 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 articlethis javadoc page , 等等

  1. “是否需要将它添加到这样的列表中?[...](也许 Game.phantomReferenceQueue 保留对它的引用?)”:根据 javadoc 页面:“引用队列,已注册的引用对象是在检测到适当的可达性更改后由垃圾收集器附加。”。所以我认为不,你不应该将它添加到列表中,因为垃圾收集器会自动将它添加到队列中。
  2. 我认为您必须稍微改写一下您的问题 - 我不明白列表的用途,即我不明白最后一段。但是,如果您使用该列表是为了知道 phantomReference 是否已被 gc,那么不,您根本不应该使用该列表,这就是 ReferenceQueue 的用途。此外,List 将防止 phantomReference 被 gc'ed!

编辑:再次阅读您的帖子标题。自己回答标题问题:不,因为 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/

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