簡體   English   中英

從Java集合中刪除對象

[英]Removing objects from Java Collections

我有一個對象的HashMap (盡管我猜這個問題也適用於其他集合)。 據我了解,當文檔討論刪除映射時,那么它就是從哈希表中刪除條目,即不一定破壞實際對象。 如果該表中唯一剩余的對該對象的引用,那么該對象會被垃圾回收嗎?

如果我執行map.clear()並且表中的那些對象未在其他任何地方引用,它們會被垃圾回收嗎?

最快的方法是實際從表中刪除所有條目,同時銷毀那些對象。

是的,如果集合是最后引用這些對象的地方,則在將它們從集合中刪除后,它們就有資格進行垃圾回收。 不,您不能強行銷毀這些物體。 垃圾收集器會在需要時處理它們。

請注意, WeakHashMap允許您在其中放置對象,並使它們有資格進行垃圾回收,只要在地圖外部不再有對鍵(不是值)的引用時-地圖條目此時將消失。

通常,您不必擔心何時會垃圾回收對象-JVM決定了這一點,並且它比您更了解其內存需求和可能的延遲。 應該擔心的是確保不再需要的對象符合垃圾收集的條件。

如果該表中唯一剩余的對該對象的引用,那么該對象會被垃圾回收嗎?

如果沒有其他引用,則該對象將在將來某個時間被垃圾回收。

您不必強制破壞對象。 如果它們是非常重的對象(或者您有太多對象無法容納在內存中),則表明您的代碼存在更根本的問題。

如果確實需要,則可以調用System.gc() ,盡管這不是一個好習慣,並且始終是代碼中潛在問題的代表。

一般而言,您無法完全控制對象何時被專門破壞。 當沒有更多(強)引用時,任何對象都可以進行垃圾回收-但不能保證何時對其進行垃圾回收,或者實際上是否可以進行垃圾回收。 即使調用System.gc()Runtime.gc()也不能保證實際執行任何操作,但這只是向JVM暗示它可能現在要考慮進行垃圾收集。 我相信,您獲得的唯一保證是,如果拋出OutOfMemoryError,則所有所有潛在的垃圾回收都在拋出錯誤之前完成。

這里涉及處理諸如密碼之類的敏感信息。 由於無法以編程方式清除字符串,因此理想情況下,您不希望這樣存儲密碼。 如果改為將其存儲為字符數組,則可以使用Arrays.fill(' ')覆蓋密碼,並確保Arrays.fill(' ')它不再駐留在內存中。

回到主題上,您很正確,如果未在其他地方引用該對象,則這兩個操作都將使該對象有資格進行垃圾回收。 實際上,Collection.clear()是一次刪除對集合中所有對象的引用的最快方法。

要真正收集垃圾,就不可能有對該對象的強引用。 具有弱引用的對象可能會被垃圾回收 使用WeakHashMap來確保它們被垃圾回收,因為在HashMap中仍然存在對該對象的引用。

您可以在清除地圖后啟動對System.gc()的調用,但這通常不是一個好主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM