所以我使用PhantomReferences.在我的场景图形节点我把它放在构造函数中:
phantomReference = new ScenePhantomReference(this,Game.phantomReferenceQueue); Game.phantomReferenceList.add(phantomReference);
正如你在第二行看到的,我将phantomReference添加到主类中的列表中.我的逻辑是,当节点被解除引用时,phantomReference不会收到垃圾,因为主类中仍然有一个引用.
将它添加到这样的列表吗?或者是否可以从GC中幸免于难(可能Game.phantomReferenceQueue会保留对它的引用?).
这是一个测试的痛苦,我可以删除列表,但GC可能只是在phantomReference之前处理正在观看的对象,并使其看起来像列表是多余的,当它真的不是.我会偏执,任何不同的虚拟机实现或版本可能决定相反做.
解决方法
不过,我也读过this article和this 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的句柄).