2011-10-11 47 views
1

我有一個HashMap,它保持對我的應用程序模塊的引用。Java:這足以刪除對象嗎?

HashMap<String, Module> modules; 

當我這樣做:

for(String key:modules.keySet()){ 
    modules.remove(key); 
} 

不應該有更多的參考,因此,他們應該在某些時候GC被刪除的對象。我是對還是錯過了一些東西?這是安全的還是有可能以某種方式重新獲得對象的訪問權限?

這是同做這種情況發生時:

modules.clear(); 

最後一個更復雜的問題是:當用GWT做這件事時,我能確定多少,對象在瀏覽器中消失了?我想在用戶註銷時執行此操作,以防止旁邊使用計算機的用戶從以前的用戶獲取任何信息。當然,大多數模塊都會將數據「忘記」爲unDetach(),但我不確定,他們都這樣做。如果有人碰巧知道我會很感激=)

+0

什麼是GC和GWT有什麼共同點?您必須記住,GWT代碼已編譯爲Javascript,並在您的瀏覽器中運行,而不是在VM中的服務器上運行。 – Strelok

回答

5

第一種方法在遍歷keySet並同時移除元素時可能會導致問題。第二種方法應該做正確的事情。如果你沒有其他的模塊引用,他們應該被垃圾回收。

1

問題的關鍵是誰又有什麼權限訪問你的模塊。如果程序的某些其他部分有可能已經獲得對某個模塊的引用,則無法確定GC是否會刪除該模塊。

在任何情況下,您都不應該依賴GC來做任何事情。它只會在需要更多空間時運行,並且是在應用程序執行完成後處理內存清理的系統。如果您想確保沒有可訪問的明智信息,請明確刪除它。

+0

「明確刪除它」 - 如果不設置爲空,該如何做? – Alex

+0

通過將您認爲「危險」的所有信息手動設置爲空值,而不是希望GC將清理對象和所有包含的數據。從你的問題中,我收集到你已經用你的'onAttach()'回調函來考慮過類似的東西。 –

3

對於與垃圾收集Java中的第一幾個問題:

HashMap中的remove(key)方法是從集合中刪除對象的安全方式。這樣做將確保該對象不再被Collection引用。但是,它本身並不保證該對象不會被任何其他參考引用 - 您作爲程序員必須確保這一點。如果確實沒有其他的參考資料,則會在某個時間點收集對象。 clear()方法也是如此。除非您有任何其他編程錯誤與訪問您的對象引用相關,否則沒有人可以訪問這些垃圾對象。

注意:使用明確的Iterator.remove()刪除元素而不是for循環。您目前的方式容易出現ConcurrentModificationException

0

只需插入這一行代碼:

modules = null; 

然後GC檢測,有那個對象上沒有更多的參考和清除它