java – PhantomReference是否在ReferenceQueue中停止PhantomReference从GC?

前端之家收集整理的这篇文章主要介绍了java – PhantomReference是否在ReferenceQueue中停止PhantomReference从GC?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用LWJGL库,不幸的是,当我的场景图中的一个节点需要死亡时,我需要释放纹理/ vbo缓冲区,我甚至不能使用finalize()方法来做到这一点,因为我不能保证它将在opengl libs期望的同一个线程中执行.

所以我使用PhantomReferences.在我的场景图形节点我把它放在构造函数中:

phantomReference = new ScenePhantomReference(this,Game.phantomReferenceQueue);
Game.phantomReferenceList.add(phantomReference);

正如你在第二行看到的,我将phantomReference添加到主类中的列表中.我的逻辑是,当节点被解除引用时,phantomReference不会收到垃圾,因为主类中仍然有一个引用.

将它添加到这样的列表吗?或者是否可以从GC中幸免于难(可能Game.phantomReferenceQueue会保留对它的引用?).

这是一个测试的痛苦,我可以删除列表,但GC可能只是在phantomReference之前处理正在观看的对象,并使其看起来像列表是多余的,当它真的不是.我会偏执,任何不同的虚拟机实现或版本可能决定相反做.

解决方法

免责声明:我还没有使用PhantomReference.

不过,我也读过this articlethis javadoc page,所以

>“将它添加到这样的列表中[…](也许Game.phantomReferenceQueue保留对它的引用?)”:根据javadoc页面:“引用队列,附加了注册的引用对象检测到适当的可达性变化后的垃圾收集器.“所以我相信没有,你不应该添加它的列表,因为队列将自动添加垃圾收集器.
>我想你必须改写一点你的问题 – 我不明白列表是什么,即我不明白最后一段.但是,如果您正在使用该列表以了解phantomReference是否已被gc’ed,那么不应该使用该列表,那就是ReferenceQueue所在.此外,列表将阻止phantomReference被gc’ed!

编辑:再次阅读您的帖子的标题.要自己回答标题问题:不,因为PhantomReference在gc’ed之后进入了ReferenceQueue – 所以根据定义,它不能被停止被gc’ed.引用第一个链接:“唯一的用途是这样的一个引用(注意:他的意思是PhantomReference)跟踪当它被引入一个ReferenceQueue的时候,因为在那个时候你知道它指向的对象是死的”

编辑#2:我也认为你的代码错误的,因为你应该初始化幻影参考如下(见一个简单的例子here):

PhantomReference scenePhantomRef = new PhantomReference(scene,phantomQueue);

其中场景是您的代码中的ScenePhantomReference(即,您应该重构代码,以使ScenePhantomReference名称为“场景”,将其实例化为场景,然后使用上面的行获取该对象的PhantomReference的句柄).

猜你在找的Java相关文章