1

我有一些对象经常被创建/销毁,并且可以同时存在于许多列表中。为了确保我没有留下对它们的引用,这些对象有一个标志 isDestroyed,如果设置了这个,每个列表都负责从列表中删除该对象。

然而,这当然是内存泄漏的增长点。如果我忘记从其中一个列表中删除对象怎么办?为了直观地监控程序是否正确运行,我重写了 finalize 并增加了一个全局变量来跟踪破坏(不是正式测试,只是为了了解一下)。然而,由于我无法控制 GC,理论上我可以永远等到某些东西被破坏。

所以问题有两个方面:当对象位于多个列表中时,“isDestroyed”是否被认为是控制对象生命周期的好方法?它迫使使用该对象的每个人小心地将其从列表中删除,这似乎很糟糕。

而且,有什么好方法可以查看对象的引用计数何时达到零,即何时计划销毁?

编辑:更具体地说,在我的情况下,我的对象代表房间中的物理实体。而且我有一个绘制每个对象的管理器类,因此它在一个列表中。另一个列表包含所有可点击的对象,所以我有另一个列表。在这种情况下,将所有对象放在一个列表中并使用多态性或实例不是一种选择。当一个对象被“销毁”时,它不应该以任何方式显示或点击,因此我想从两个列表中删除它。

4

4 回答 4

2

你应该看看java.lang.ref包裹。

而且,有什么好方法可以查看对象的引用计数何时达到零,即何时计划销毁?

您可以使用ReferenceQueue对象

来自JavaDoc _java.lang.ref.ReferenceQueue

参考队列,在检测到适当的可达性更改后,垃圾收集器会将已注册的参考对象附加到这些队列中。

于 2012-04-18T20:47:38.030 回答
1

我认为这就是 WeakReference 和 ReferenceQueue 的用途 - 您为要跟踪的对象创建一个 WeakReference 并将其与 ReferenceQueue 相关联。然后你有另一个线程处理从 ReferenceQueue.remove() 返回的 WeakReference(s)。当引用的对象被 GC'd 时,WeakReference 被添加到 ReferenceQueue。但是,您能否举例说明当引用的对象已死时您要清理的这些列表是什么?

于 2012-04-18T20:47:55.933 回答
1

通常处理这种情况的方式是通过观察者模式。每个列表都附加一个销毁侦听器,该侦听器在销毁时得到通知。这如何与你的架构相结合,我没有细节可以判断。

于 2012-04-18T21:12:43.877 回答
0

如果您想收到通知,我几乎可以肯定您需要 PhantomReference,请在此处阅读:

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

于 2012-07-20T23:59:10.740 回答