这个问题已经在这里有一个答案:
- 你什么时候会使用WeakHashMap中或WeakReference的? 10个回答
什么是WeakHashMap
,一个时,应使用它吗? 什么是之间的差异WeakHashMap
和HashMap
?
这个问题已经在这里有一个答案:
什么是WeakHashMap
,一个时,应使用它吗? 什么是之间的差异WeakHashMap
和HashMap
?
处于弱势的HashMap元素可以被垃圾收集器如果存在对关键对象没有其他强引用,这使得他们的缓存/查找存储有用的回收。
弱引用并不限于这些哈希表,您可以使用WeakReference的单一对象。 他们节省资源非常有用,你可以保留的东西的参考,但允许它被收集在没有其他引用它。 (顺便说一句,很强的参考是一个普通的Java参考)。 也有弱引用这往往不被那样容易收集的软引用(不容易挂关于过去强引用消失后不久)
正如其他人已经指出,弱引用提供使用一个对象作为重点,而无需创建一个强引用它的一种手段。 这是在你不想损害JVM的能力,垃圾收集对象的情况下是有用的,但仍然要跟踪的对象,这使得缓存关于对象的弱引用理想或存储元数据的某些方面的能力。
我建议你阅读“了解弱引用” (甲骨文博客文章),在Java有关强与弱引用 。 如果没有差异的理解,数据结构本身没有什么意义。
结账有效的Java,第2版,第26页。
内存泄漏的另一种常见的来源是高速缓存。 一旦你把一个对象引用到缓存中,人们很容易忘记它的存在,并把它留在它变得无关紧要很久之后高速缓存。 有几种解决问题的对策。 如果你足够幸运,实现缓存其中一个条目是相关的准确,只要有缓存外,其重点引用,代表缓存为WeakHashMap中 ; 参赛作品将它们变得过时后自动删除。 请记住,仅当高速缓存条目的期望寿命是通过给该键,不值的外部引用确定WeakHashMap中是有用的。
从jGuru :
一个WeakHashMap中是一个特殊的Map实现,其中地图的密钥存储在一个
java.lang.ref.WeakReference
。 通过存储在弱引用的键,键 - 值对可以被动态地从地图时到键的唯一引用是从弱引用丢弃。 这使得WeakHashMap的一个很好的实施弱引用的列表,其中未在别处使用的条目可以与无副作用被丢弃。 此外,仅仅因为一个关键可能被丢弃,并不意味着它会立即被删除。 如果系统有足够的资源,这是不是外部引用的弱密钥参考可以留了很长一段时间。
更多参考 :
弱引用有关的可达性 ,并让垃圾收集器 (GC)为你做的工作。 我认为这是最好的理解弱引用正在设法解决,并看到它在行动的问题:
一个IBM的文章有关:
Java理论与实践:堵住内存泄漏弱引用。 内存泄漏与全球地图,确定内存泄漏,救援弱引用,...
一个博客文章有关何时使用WeakHashMap中:
......如果WeakHashMap的是缓存没有好,又是什么好? 这是好事,实现规范地图。 比方说,你想要一些额外的信息,你有一个强大的参考对象相关联。 你把与对象作为键WeakHashMap中的条目,而额外的信息作为映射值。 然后,只要你保持一个强大的参考对象,你就可以查询地图检索额外的信息。 一旦你释放对象时,映射条目将被清除,并通过额外的信息使用的内存将被释放。 ...
在Java 有关的java.lang.ref文档
人们用它来实现“高速缓存”。 如果你有在你的应用程序经常重复使用一些对象,他们的建筑是昂贵的,有太多的人,让他们所有的记忆 - - 您使用WeakHashMap中。
放在那里当前未使用的对象。 当需要这个对象 - 它弄出来的地图。 对于大多数的大部分时间这些对象将被留在地图上。 诀窍是,他们不直接持有,而是通过在WeakReferences。 所以,如果它变得非常“拥挤”,当我们运行内存,GC将被允许收集它们。 所以每次尝试获取对象从WeakHashMap中的时候,你必须确保它仍然存在。 否则,你需要重新创建它。
您可以使用WeakHashMap中,以减少内存泄漏的机会,因为缓存一些对象的结果。 每当到关键的所有引用都被删除了WeakHashMap中会自动删除条目。
WeakHashMap中允许其条目被垃圾收集,而不是等待完整的HashMap是不用的。 所以,当它的关键是在普通使用不再会自动删除单个值。
它可以用来防止内存泄漏,其中的HashMap从来没有开垦为一个或多个密钥仍然在使用,即使最大的不一样,用户数据等...