【问题标题】:Freeing a HashMap and considering shrinkage释放 HashMap 并考虑收缩
【发布时间】:2020-07-05 09:36:43
【问题描述】:

我想正确释放与HashMap 关联的内存。这个答案建议使用clear()

Map.clear() vs new Map : Which one will be better?

不过,它没有考虑到clear() 不会将容量缩小到原始大小。因此,清除 HashMap 的 10k 个项目,将留下这 10k 个项目的空间。

另一方面,这个答案建议使用null 并考虑到收缩并建议您使用null 而不是clear()

how to clear objects (HashMap) to be garbage collected - Java

我正在使用HashMap 在启动时缓存项目并在其他一些处理之后处理它们。当我用完它们时,我不再需要它们了。不过,如果用户决定执行相同的操作(很少发生),我会再次使用 HashMap 来缓存项目并处理它们,然后将它们删除。

我有点困惑。我应该使用哪种方法?

谢谢。

【问题讨论】:

  • '...清除 HashMap 的 10k 个项目,将留下这 10k 个项目的空间':不,不会。它将为 10,000 个 *references*` 留下空间。

标签: java android


【解决方案1】:

正如提到的here(你经历过的),

将 Map 设置为 null 即可。但请记住,垃圾收集发生在后台,并且仅在需要时发生。因此,您可能不会立即看到大量内存被释放

您甚至可以查看 WeakHashMap here。它的键是 'Weakreference'-d 因此垃圾被急切地收集。

WeakHashMap 非常适合这样的场景:(引自here

假设我们要构建一个缓存,将大图像对象作为值,将图像名称作为键。我们想选择一个合适的地图实现来解决这个问题。

使用简单的 HashMap 将不是一个好的选择,因为值对象可能会占用大量内存。更重要的是,它们永远不会被 GC 进程从缓存中回收,即使它们不再在我们的应用程序中使用。

理想情况下,我们需要一个允许 GC 自动删除未使用对象的 Map 实现。

【讨论】:

  • 感谢您的信息。我真的不明白 WeakHashMap 是如何工作的。我在操作期间缓存了这些值。然后,大约一分钟后,我遍历了 HashMap 项。我决定采用 HashMap 的 null 方法。
【解决方案2】:

对于您的用例,我认为使用WeakHashMap 是最好的。这非常适合您,因为您不需要长时间使用 hashmap。所以弱引用比强引用的 HashMap 要好。

WeakHashMap<String, String> map = new WeakHashMap<>();
    map.put("Hello", "test");

【讨论】:

  • 调用 System.gc() 被认为是不好的做法,除非你的内存使用情况很糟糕。
  • 这只是一个测试这个 WeakHashMap 如何工作的例子。如果不在这里调用 gc,您如何知道 gc 何时会收集您的参考资料?
  • 即使您致电System.gc(),您也不知道GC 会收集您的参考资料。说真的,只是不要这样做。你会给别人一个错误的想法,即他们应该这样做。
猜你喜欢
  • 2018-02-21
  • 2018-04-19
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多