我最近了解到Java中的 WeakHashMap
数据结构。
然而,我不理解当它不再被常规使用时,它如何通过垃圾回收来清除映射。这个数据结构如何知道我在程序中不再使用键?如果我很长时间没有引用一个键会怎样呢?
我最近了解到Java中的 WeakHashMap
数据结构。
然而,我不理解当它不再被常规使用时,它如何通过垃圾回收来清除映射。这个数据结构如何知道我在程序中不再使用键?如果我很长时间没有引用一个键会怎样呢?
SoftReference
和PhantomReference
对象,这使情况变得更加复杂。)
WeakHashmap
唯一的涉及是:
WeakReference
对象作为键,并如果长时间不引用键会发生什么?
决定打破弱引用的标准不是基于时间的。
但是时间可能会影响是否删除键。例如,一个键可以1)不再被强引用,2)从映射中检索出来,3)分配给可达变量,使其再次成为强引用。如果GC不在键不强可达的窗口期运行,那么该键及其关联值将保留在映射中。(这就是您想要发生的...)
1- 实现细节:在最近的Java版本中,弱引用实际上指的是映射的内部Entry
对象,而不是键。这样可以更有效地从映射中清除失效的引用。详见代码。
2- 软引用是一种GC允许在堆内存短缺时打破的引用类型。
WeakReference
的对象SoftReference
的对象在虚拟机抛出
OutOfMemoryError
之前,所有对可达对象的软引用都已被清除。