【问题标题】:how to clear objects (HashMap) to be garbage collected - Java如何清除要被垃圾收集的对象(HashMap) - Java
【发布时间】:2015-04-09 01:07:54
【问题描述】:

所以我在这里拥有的是一个 java 程序,它处理大量数据并将其存储到对象中(主要是哈希映射)。在运行时间的某个时间点,数据变得无用,我需要丢弃,以便释放一些内存。

我的问题是丢弃这些数据以进行垃圾收集的最佳行为是什么?

我已经尝试了 map.clear(),但是这不足以清除地图分配的内存。

编辑(添加我尝试过的替代方案)

我也尝试过 system.gc() 来强制垃圾收集器运行,但是没有帮助

【问题讨论】:

  • 内存未清除,对象变为未引用。如果您的程序需要更多内存,则发生垃圾收集,它不可用,然后启动 GC 并回收所有未引用的对象。对于一些 Java 程序来说,GC 很可能在程序运行时永远不会发生,因为不需要更多内存。
  • "这不足以清除地图分配的内存"。你是怎么得出这个结论的?

标签: java memory memory-management garbage-collection hashmap


【解决方案1】:

HashMap#clear 会将所有条目扔出 HashMap,但 it will not shrink it back to its initial capacity。这意味着您将有一个空的后备数组(在您的情况下,我猜是)用于数万个条目的空间。

如果您不打算重复使用 HashMap(数据量大致相同),只需丢弃整个 HashMap 实例(将其设置为null)。

除上述之外:

  • 如果 Map 的条目仍被系统的其他部分引用,即使从 Map 中删除它们也不会被垃圾回收(因为其他地方需要它们)
  • 垃圾收集在后台进行,并且仅在需要时进行。因此,您可能不会立即看到大量内存被释放,这可能不是问题。

【讨论】:

  • 有道理。即使 entry instance (如果有)的泄漏引用也不会影响性能。 +1 :)
  • 因此,如果一个人使用具有大量条目的哈希图,然后在程序中它变得更小(少数条目)但仍然使用,它可能应该被复制到一个new HashMap 具有复制构造函数,而不是保留。对吗?
  • 我不知道... 通常,程序有某种工作内存需求,释放一些几分钟后再次需要的内存似乎不是什么大胜利。即使释放不再使用的内存也可能不会真正使任何人受益。除非我正在处理非常庞大的收藏品,否则我不会担心这些事情。如果是这样的话,也许无论如何都需要一个更完整的解决方案(例如堆外存储)。
【解决方案2】:
 system.gc() 

不推荐,因为 jvm 应该是唯一负责所有垃圾收集的。在这种情况下使用 Class WeakHashMap<K,V>。 如果密钥不再有效,对象将自动删除

Please read this link for reference

【讨论】:

  • 你怎么知道 WeakHashMap 在这里合适?
  • 我很惊讶...为什么人们没有投票赞成这个答案!??我认为 WeakHashMap 非常适合这种情况。不是吗??有人可以讨论一下吗??
  • @MananShah 好吧,如果你需要一个带顺序的哈希图,所以你应该使用 LinkedHashMap,你不能总是使用一种哈希图,因为你可能需要另一种。
猜你喜欢
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多