153

什么是 aWeakHashMap以及何时应该使用它?WeakHashMapa和 a 有什么区别HashMap

4

8 回答 8

83

如果没有对键对象的其他强引用,垃圾收集器可以回收弱哈希图中的元素,这使得它们对缓存/查找存储很有用。

弱引用不限于这些哈希表,您可以将 WeakReference 用于单个对象。它们对于节省资源很有用,您可以保留对某些内容的引用,但在没有其他内容引用它时允许收集它。(顺便说一句,强引用是普通的 java 引用)。还有一些弱引用,它们往往不像软引用那样容易收集(在最后一个强引用消失后,它们不会停留很长时间)

于 2011-04-01T09:12:04.033 回答
51

正如其他人已经指出的那样,弱引用提供了一种将对象用作键的方法,而无需创建对它的强引用。这在您不想削弱 JVM 垃圾收集对象的能力但仍希望能够跟踪对象的某些方面的情况下很有用,这使得弱引用非常适合缓存或存储有关对象的元数据.

我建议阅读“了解弱引用”(Oracle 博客文章),了解Java 中的强引用与弱引用。如果不了解差异,数据结构本身就毫无意义。

于 2011-04-01T09:19:31.617 回答
21

结帐 Effective Java,第 2 版,第 26 页。

内存泄漏的另一个常见来源是缓存。一旦将对象引用放入缓存中,很容易忘记它的存在,并在它变得无关紧要很久之后将其留在缓存中。这个问题有几种解决方案。如果你有幸实现了一个缓存,只要在缓存之外有对其键的引用,就可以将缓存表示为WeakHashMap;条目过时后将自动删除。请记住,仅当缓存条目的所需生命周期由对键的外部引用而不是值确定时, WeakHashMap才有用。

于 2013-07-01T13:58:08.477 回答
11

来自jGuru

WeakHashMap 是一种特殊的 Map 实现,其中映射的键存储在 java.lang.ref.WeakReference. 通过将键存储在弱引用中,当键的唯一引用来自弱引用时,可以从映射中动态删除键值对。这使得 WeakHashMap 成为弱引用列表的出色实现,其中未在其他地方使用的条目可能会被删除而没有副作用。此外,仅仅因为一个键可能被丢弃,并不意味着它会立即被丢弃。如果系统有足够的资源,没有被外部引用的弱键引用可能会存在很长时间。

更多关于参考

于 2011-04-01T09:13:34.520 回答
8

弱引用是关于可达性并让垃圾收集器(GC) 为您完成工作。我认为最好理解弱引用试图解决的问题并看到它的实际效果:

  • 一篇关于以下内容的IBM 文章

    Java 理论与实践:用弱引用堵塞内存泄漏。全局映射的内存泄漏,识别内存泄漏,对救援的弱引用,...

  • 关于何时使用 Wea​​kHashMap的博客文章(链接已过期) :

    ... 如果 WeakHashMap 不适合缓存,那么它有什么用?实现规范地图是件好事。假设您想将一些额外信息与您具有强引用的对象相关联。您在 WeakHashMap 中放置一个条目,其中对象作为键,额外信息作为映射值。然后,只要您保持对该对象的强引用,您就可以检查地图以检索额外的信息。并且一旦释放对象,映射条目将被清除,额外信息使用的内存将被释放。...

  • 关于 java.lang.ref的 Java文档

于 2014-07-16T08:25:27.440 回答
4

人们用它来实现“高速缓存”。如果你有一些在你的应用程序中经常被重用的对象,并且它们的构造很昂贵,并且它们太多而无法将它们全部保存在内存中 - 你使用 Wea​​kHashMap。

将当前未使用的对象放在那里。当需要此对象时 - 将其从地图中取出。在大多数情况下,这些对象中的大多数都将保留在地图中。诀窍是它们不是直接保存的,而是通过 WeakReferences 保存的。因此,如果它真的“拥挤”,当我们的内存不足时,gc 将被允许收集它们。因此,每次尝试从 WeakHashMap 中取出对象时,都必须确保它仍然存在。否则,您需要重新创建它。

于 2012-01-13T09:36:35.263 回答
2

您可以使用 Wea​​kHashmap 来减少由于缓存某些对象而导致内存泄漏的机会。每当删除对键的所有引用时,WeakHashMap 都会自动删除条目。

于 2011-04-01T09:14:07.157 回答
1

Weakhashmap 允许对其条目进行垃圾收集,而不是等待完整的 hashmap 未被使用。因此,当它的键不再被正常使用时,它会自动删除单个值。

它可以用来防止内存泄漏,因为一个或多个键仍在使用中,hashmap 永远不会被回收,即使最大值不是,比如用户数据等......

于 2016-01-05T00:16:56.723 回答