什么是WeakHashMap
什么时候应该使用它? WeakHashMap
和HashMap
之间有什么区别?
答案 0 :(得分:77)
如果没有对密钥对象的其他强引用,垃圾收集器可以回收弱hashmap中的元素,这使得它们对缓存/查找存储很有用。
弱引用不限于这些哈希表,您可以将WeakReference用于单个对象。它们对于保存资源非常有用,您可以保留对某些内容的引用,但允许在没有其他内容引用时对其进行收集。 (顺便说一下,强引用是一个普通的java引用)。也有一些弱引用,往往不像软引用那样容易收集(在最后一个强引用消失后不会长时间持续存在)
答案 1 :(得分:43)
正如其他人已经指出的那样,弱引用提供了一种将对象用作键而不创建对它的强引用的方法。这在您不希望损害JVM垃圾收集对象的能力的情况下非常有用,但仍然希望能够跟踪对象的某些方面,这使得弱引用非常适合缓存或存储有关对象的元数据
我建议阅读"Understanding Weak References"(Oracle博客文章),关于Java中的强与弱引用。如果不了解差异,数据结构本身就没有多大意义。
答案 2 :(得分:19)
checkout Effective Java,Edition 2,page 26。
内存泄漏的另一个常见原因是缓存。一旦你放了一个 对象引用到缓存中,很容易忘记它存在并将其保留在缓存中 缓存变得无关紧要。这个问题有几种解决方案。 如果你足够幸运,可以实现一个与条目完全相关的缓存 只要在缓存之外有对其密钥的引用,就表示缓存 作为 WeakHashMap ;条目将在过时后自动删除。 请记住, WeakHashMap 仅在所需的缓存生命周期内有用 条目由对密钥的外部引用确定,而不是值。
答案 3 :(得分:11)
来自jGuru:
WeakHashMap是一个特殊的Map 实现哪里的密钥 地图存储在
java.lang.ref.WeakReference
。通过 将密钥存储在弱引用中, 键值对可以是动态的 当时只从地图上掉下来 关键的参考来自弱者 参考。这就是WeakHashMap 一个很好的实现 弱引用列表,其中条目 其他地方没有使用的可能是 掉了没有副作用。也, 只是因为钥匙可能掉落, 并不意味着它会立即成为 下降。如果系统足够 资源,弱关键参考 没有外部引用可以留下来 很长一段时间。
有关References的更多信息:
答案 4 :(得分:7)
弱引用是关于可达性,让垃圾收集器(GC)为您完成工作。 我认为最好理解弱引用试图解决的问题,并将其视为实际行动:
IBM article关于:
Java理论与实践:使用弱引用来堵塞内存泄漏。 内存泄漏全局映射,识别内存泄漏,对救援的弱引用,......
关于何时使用WeakHashMap的blog article:
...如果WeakHashMap对缓存没有好处,那么它有什么用呢? 实现规范地图是很好的。让我们说你想联想 一些额外的信息,你有一个强大的参考对象 至。您将一个条目放在WeakHashMap中,并将该对象作为键,然后 额外信息作为地图值。然后,只要你保持一个 强烈引用该对象,您将能够检查到该地图 检索额外的信息。一旦你释放了对象,那么 将清除映射条目并使用额外信息使用的内存 将会被释放。 ...
答案 5 :(得分:4)
人们用它来实现'缓存“。 如果您有一些可以重复使用的对象 通常在你的应用程序中,以及他们的 建筑很昂贵,那里 太多了,无法保留所有这些 在记忆中 - - 你使用WeakHashMap。
放置当前不存在的对象 用过的。当需要这个对象时 - 把它拿出来 的地图。在大多数情况下,大多数时间 物品将留在地图上。 诀窍是他们没有举行 直接,但通过WeakReferences。 因此,如果它真的“拥挤”,那么当我们跑步时 内存不足,gc将被允许收集 他们。 所以每次你试图让对象出来 WeakHashMap,你必须确保它 还在那里。否则你需要 重新创造它。
答案 6 :(得分:2)
您可以使用WeakHashmap来减少因缓存某些对象而导致内存泄漏的可能性。只要删除了对该键的所有引用,WeakHashMap就会自动删除条目。
答案 7 :(得分:0)
Weakhashmap允许其条目被垃圾收集,而不是等待完整的hashmap被使用。因此,当其密钥不再正常使用时,它将自动删除单个值。
它可用于防止内存泄漏,其中hashmap永远不会被回收,因为一个或多个密钥仍在使用中,即使最大值没有,如用户数据等......