2012-04-18 75 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