什么是WeakHashMap以及何时使用它?

什么是WeakHashMap ,什么时候应该使用它? WeakHashMapHashMap什么区别?

如果没有其他关键对象的强引用,则垃圾收集器可以回收弱散列表中的元素,这使得它们对于caching/查找存储非常有用。

弱引用不限于这些散列表,你可以对单个对象使用WeakReference。 它们对于节省资源非常有用,你可以保留对某个东西的引用,但是当没有其他东西引用它的时候,允许它被收集。 (顺便说一句,强大的参考是一个正常的java参考)。 还有一些弱引用,往往不像软引用那样容易收集(在最后一个强引用消失之后,这些引用不会长时间停留)

正如其他人已经指出的那样,他们提供了一个手段,使用一个对象作为一个关键,没有创造一个强有力的参考。 当你不想损害JVM垃圾收集对象的能力,但仍然希望能够跟踪对象的某些方面时,这是非常有用的,这使得它们成为caching或存储关于对象的元数据的理想select。

我build议阅读“理解弱引用” (Oracle博客文章),了解Java中的强与弱引用。 没有了解差异,数据结构本身就没有什么意义。

结帐有效的Java,第2版,第26页。

内存泄漏的另一个常见来源是caching。 一旦将对象引用放入caching中,很容易忘记它已经存在,并在caching变得无关紧要之后很长时间将其保留在caching中。 有几个解决这个问题的方法。 如果你足够幸运的话,只要在caching之外有关键的引用,就可以实现一个与条目相关的caching,将caching表示为WeakHashMap ; 条目将被废弃后自动删除。 请记住, WeakHashMap仅在高速caching条目的所需生命周期由对键的外部引用(而非值)确定时才有用。

来自jGuru :

WeakHashMap是一个特殊的Map实现,其中映射的键存储在java.lang.ref.WeakReference 。 通过将键存储在弱引用中,当对键的唯一引用来自弱引用时,键值对可以dynamic地从映射中删除。 这使WeakHashMap成为弱引用列表的一个很好的实现,其中没有在别处使用的条目可以被放弃而没有副作用。 另外,只是因为一个关键可能会被丢弃,并不意味着它会立即被丢弃。 如果系统有足够的资源,那么没有被外部引用的弱关键引用可能会长期存在。

更多关于参考 :

弱引用关于可达性,让GC为你做工作。 我认为最好理解这个薄弱的参考文献试图解决的问题,

  • 一篇关于IBM的文章 :

    Java理论与实践:用弱引用来封堵内存泄漏。 内存泄漏与全球地图,识别内存泄漏,弱援引援救,…

  • 关于何时使用WeakHashMap的博客文章 :

    …如果WeakHashMap不适合caching,那么有什么好处呢? 实施规范地图是很好的。 比方说,你想把一些额外的信息关联到你有很强的参考的对象。 你把一个条目放到一个WeakHashMap中,把这个对象作为关键字,把额外的信息作为map值。 那么,只要你保持强烈的对象的引用,你将能够检查地图来检索额外的信息。 一旦你释放对象,地图项将被清除,额外信息所使用的内存将被释放。 …

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

人们用它来实现“caching”。 如果你的应用程序中有一些经常被重用的对象,而且它们的构造很昂贵,并且有太多的东西把它们全部放在内存中 – 你使用WeakHashMap。

把目前没有使用的对象放在那里。 当需要这个对象时 – 把它从地图中取出。 在大多数时候,大部分这些对象将停留在地图上。 诀窍是他们不是直接持有,而是通过WeakReferences。 所以如果真的“拥挤”,当我们内存不足时,gc将被允许收集它们。 所以每当你试图把对象从WeakHashMap中取出,你都必须确保它仍然存在。 否则,你需要重新创build它。

您可以使用WeakHashmap来caching由于caching某个对象而导致内存泄漏的机会。 WeakHashMap将自动删除条目,只要删除了对键的所有引用。

Weakhashmap允许其条目被垃圾收集,而不是等待完整的hashmap被使用。 所以,当密钥不再是普通用途时,它会自动删除单个值。

它可以用来防止内存泄漏,hashmap永远不会收回作为一个或多个键仍在使用,即使最大不是像用户数据等…