2012-04-18 80 views
1

我有一些经常创建/销毁的对象,可以同时存在于多个列表中。为了确保我没有剩下的引用,对象有一个isDestroyed标志,如果设置了这个标志,每个列表都负责从列表中删除对象。监控Java对象破坏

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

所以这个问题是双重的:当拥有多个列表中的对象时,是否将“isDestroyed”视为控制对象生命期的好方法?它会强制每个使用该对象的人注意将其从列表中删除,这看起来很糟糕。

而且,有没有什么好方法可以看到引用计数何时在对象上达到零,也就是说当它的计划被销毁?

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

回答

2

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

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

可以使用ReferenceQueue对象

的JavaDoc java.lang.ref.ReferenceQueue

引用队列的,向其中注册的引用对象被垃圾收集器的合适的可到达性更改后 是所附 检测。

1

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

1

通常处理的方式是通过Observer模式。每个列表都附有一个销毁监听器,在销毁时收到通知。这如何与你的建筑相结合,我没有细节来判断。

+0

香港专业教育学院只用观察员的事件,但是这是一个有趣的想法,例如一个ArrayList延伸到处理这个(事情。我会避免WeakReference引起的空检查。更好的办法是以某种方式防止同事把对象放在例如一个正常的arraylist中 – Rolle 2012-04-18 22:12:36

+0

我建议(如果可行)不要扩展'ArrayList',而是在你自己的类中实现'List',使用'ArrayList'作为后台存储(* Decorator *模式)。你也可以发明一个新的界面,“Destroyable”,并强制执行人们使用的列表必须是“Destroyable”的策略。另一个想法是一个接口'DestroyableList extends List'。 – 2012-04-19 07:18:20