[英]Removing objects from Java Collections
我有一個對象的HashMap
(盡管我猜這個問題也適用於其他集合)。 據我了解,當文檔討論刪除映射時,那么它就是從哈希表中刪除條目,即不一定破壞實際對象。 如果該表中唯一剩余的對該對象的引用,那么該對象會被垃圾回收嗎?
如果我執行map.clear()
並且表中的那些對象未在其他任何地方引用,它們會被垃圾回收嗎?
最快的方法是實際從表中刪除所有條目,同時銷毀那些對象。
是的,如果集合是最后引用這些對象的地方,則在將它們從集合中刪除后,它們就有資格進行垃圾回收。 不,您不能強行銷毀這些物體。 垃圾收集器會在需要時處理它們。
請注意, WeakHashMap允許您在其中放置對象,並使它們有資格進行垃圾回收,只要在地圖外部不再有對鍵(不是值)的引用時-地圖條目此時將消失。
通常,您不必擔心何時會垃圾回收對象-JVM決定了這一點,並且它比您更了解其內存需求和可能的延遲。 您應該擔心的是確保不再需要的對象符合垃圾收集的條件。
如果該表中唯一剩余的對該對象的引用,那么該對象會被垃圾回收嗎?
如果沒有其他引用,則該對象將在將來某個時間被垃圾回收。
您不必強制破壞對象。 如果它們是非常重的對象(或者您有太多對象無法容納在內存中),則表明您的代碼存在更根本的問題。
如果確實需要,則可以調用System.gc()
,盡管這不是一個好習慣,並且始終是代碼中潛在問題的代表。
一般而言,您無法完全控制對象何時被專門破壞。 當沒有更多(強)引用時,任何對象都可以進行垃圾回收-但不能保證何時對其進行垃圾回收,或者實際上是否可以進行垃圾回收。 即使調用System.gc()或Runtime.gc()也不能保證實際執行任何操作,但這只是向JVM暗示它可能現在要考慮進行垃圾收集。 我相信,您獲得的唯一保證是,如果拋出OutOfMemoryError,則所有所有潛在的垃圾回收都在拋出錯誤之前完成。
這里涉及處理諸如密碼之類的敏感信息。 由於無法以編程方式清除字符串,因此理想情況下,您不希望這樣存儲密碼。 如果改為將其存儲為字符數組,則可以使用Arrays.fill(' ')
覆蓋密碼,並確保Arrays.fill(' ')
它不再駐留在內存中。
回到主題上,您很正確,如果未在其他地方引用該對象,則這兩個操作都將使該對象有資格進行垃圾回收。 實際上,Collection.clear()是一次刪除對集合中所有對象的引用的最快方法。
您可以在清除地圖后啟動對System.gc()的調用,但這通常不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.