弱哈希映射如何知道对对象进行垃圾回收?
我最近发现了Java中的WeakHashMap
数据结构。
但是,我不明白当映射不再在正常使用时,它会垃圾回收映射是什么意思。数据结构如何知道我将不再在我的程序中使用密钥?如果我很长一段时间没有引用密钥怎么办?
我最近发现了Java中的WeakHashMap
数据结构。
但是,我不明白当映射不再在正常使用时,它会垃圾回收映射是什么意思。数据结构如何知道我将不再在我的程序中使用密钥?如果我很长一段时间没有引用密钥怎么办?
但是,我不明白当映射不再在正常使用时,它会垃圾回收映射是什么意思。
还行。在正常情况下,当垃圾回收器运行时,它将删除程序无法再使用的对象。技术术语是“无法访问的对象”,这意味着程序执行无法再获得对该对象的引用。无法访问的对象可能会在下一个GC周期中收集...还是没有。无论哪种方式,它都不再是应用程序关注的问题。
在这种情况下,使用调用的特殊类来引用键1。弱引用是一个对象,其作用有点像间接指针(指向持有指针的对象的指针)。它具有有趣的特性,即垃圾回收器被允许中断引用;即,将其包含的引用替换为 .规则是,当GC注意到该对象不再可通过正常(强)或软引用2链访问时,对对象的弱引用将被破坏。WeakHashMap
WeakReference
null
“不再在正常使用中”这句话实际上意味着关键对象不再强烈或软弱地可以触及;即通过强力和/或软引用链。
数据结构如何知道我将不再在我的程序中使用密钥?
不这样做。相反,是 GC 注意到密钥不是强力可访问的。WeakHashmap
作为其正常遍历的一部分,GC 将查找并标记所有强烈可访问的对象。然后,它会遍历所有对象并检查它们引用的对象是否已标记,如果它们尚未标记,则将其断开。我从未看过实际的GC实现。而且它很复杂,因为它也必须处理和对象。WeakReference
SoftReference
PhantomReference
唯一的参与是:WeakHashmap
WeakReference
WeakReferences
如果我很长一段时间没有引用密钥怎么办?
决定弱引用应被打破的标准不是基于时间的。
但是,时间可能会影响是否不删除密钥。例如,一个键可以1)不再是强引用,2)从地图中检索,3)分配给一个可访问的变量,使其再次被强引用。如果 GC 在键不可强访问的窗口中未运行,则键及其关联值将保留在地图中。(这是你想要发生的事情...)
1 - 实现细节:在最近的 Java 版本中,弱引用实际上指的是映射的内部 Entry
对象,而不是键。这样可以更有效地从映射中清除损坏的引用。有关详细信息,请查看代码。
2 - 软引用是一种在堆内存不足时允许 GC 中断的引用。