监视 Java 对象销毁



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

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

所以问题是双重的:当对象位于多个列表中时,"isDestroy"是否被认为是控制对象生存期的好方法?它迫使使用该对象的每个人都注意将其从列表中删除,这似乎很糟糕。

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

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

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

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

您可以使用引用队列对象

来自 JavaDoc of java.lang.ref.ReferenceQueue

引用队列

,已注册的引用对象将附加到该队列 在适当的可访问性更改后由垃圾回收器 被检测到。

我认为这就是WeakReference和ReferenceQueue

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

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

如果你想得到通知,我几乎可以肯定你需要PhantomReference,请阅读这里:

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

最新更新