2015-02-09 394 views
3

所以我在這裏是一個java程序操縱大量的數據並將其存儲到對象(主要是哈希映射)。在運行時間的某個點,數據變得毫無用處,我需要放棄,這樣我就可以釋放一些內存。如何清除垃圾回收對象(HashMap) - Java

我的問題是拋棄這些垃圾收集數據的最佳行爲是什麼?

我試過map.clear(),但是這不足以清除地圖分配的內存。

編輯(添加我都試過的替代品)

我也曾嘗試的System.gc()來強制垃圾收集器運行,但它並沒有幫助

+1

內存也未被清除,則對象變得未引用 的對象將自動被刪除。如果您的程序需要更多內存,則該垃圾收集將不可用,然後啓動GC並收回所有未引用的對象。一些Java程序很可能在程序的運行時間中不會發生GC,因爲不需要更多的內存。 – Mnementh 2015-02-09 10:15:21

+0

「這不足以清除地圖分配的內存」。你是如何得出這個結論的? – Thilo 2015-02-09 10:25:03

回答

9

的HashMap#明確將拋出HashMap中的所有條目,但it will not shrink it back to its initial capacity。這意味着你將有一個空的後備陣列(在你的情況下,我猜)爲數以萬計的條目空間。

如果您不打算重新使用HashMap(數據量大致相同),只需丟棄整個HashMap實例(將其設置爲null)即可。

除了上面:

  • 如果地圖的項目仍然受到系統的其他部分引用,他們不會被垃圾回收時,它們從地圖(即使刪除因爲他們在其他地方需要)
  • 垃圾收集發生在後臺,並且僅在需要時纔會發生。所以你可能不會立即看到很多內存被釋放,這可能不是問題。
+1

有道理。即使泄露了* entry instance *(如果有)的引用也不會影響性能。 +1 :) – TheLostMind 2015-02-09 10:20:10

+1

那麼,如果一個人使用了大量條目的散列表,並且後來在程序中變得更小(很少條目)但仍然被使用,它應該被複制到一個新的HashMap中一個複製構造函數而不是保持周圍。對? – RealSkeptic 2015-02-09 10:31:00

+0

我不知道...通常情況下,程序有一些工作內存需求,釋放一些內存,幾分鐘後會再次需要,似乎不是一個大贏。即使釋放再也不用的記憶可能不會真正惠及任何人。除非我正在處理非常龐大的藏品,否則我不會擔心這些事情。如果是這樣的話,也許會有更完整的解決方案(比如堆外存儲)。 – Thilo 2015-02-09 11:02:54

4
system.gc() 

不推薦,因爲JVM應採取一切垃圾收集的照顧唯一的一個。在這種情況下使用Class WeakHashMap<K,V>。如果密鑰不再有效

Please read this link for reference

+1

你怎麼知道WeakHashMap在這裏適合? – Thilo 2015-02-09 11:04:29

+0

我很驚訝......爲什麼人們沒有選擇這個答案!我認爲WeakHashMap對於這種情況是完美的。不是嗎?有人可以請討論這個? – 2016-06-18 09:08:12