弱哈希映射如何知道对对象进行垃圾回收?

我最近发现了Java中的WeakHashMap数据结构。

但是,我不明白当映射不再在正常使用时,它会垃圾回收映射是什么意思。数据结构如何知道我将不再在我的程序中使用密钥?如果我很长一段时间没有引用密钥怎么办?


答案 1

但是,我不明白当映射不再在正常使用时,它会垃圾回收映射是什么意思。

还行。在正常情况下,当垃圾回收器运行时,它将删除程序无法再使用的对象。技术术语是“无法访问的对象”,这意味着程序执行无法再获得对该对象的引用。无法访问的对象可能会在下一个GC周期中收集...还是没有。无论哪种方式,它都不再是应用程序关注的问题。

在这种情况下,使用调用的特殊类来引用键1。弱引用是一个对象,其作用有点像间接指针(指向持有指针的对象的指针)。它具有有趣的特性,即垃圾回收器被允许中断引用;即,将其包含的引用替换为 .规则是,当GC注意到该对象不再可通过正常(强)或软引用2链访问时,对对象的弱引用将被破坏。WeakHashMapWeakReferencenull

“不再在正常使用中”这句话实际上意味着关键对象不再强烈或软弱地可以触及;即通过强力和/或软引用链。

数据结构如何知道我将不再在我的程序中使用密钥?

不这样做。相反,是 GC 注意到密钥不是强力可访问的。WeakHashmap

作为其正常遍历的一部分,GC 将查找并标记所有强烈可访问的对象。然后,它会遍历所有对象并检查它们引用的对象是否已标记,如果它们尚未标记,则将其断开。我从未看过实际的GC实现。而且它很复杂,因为它也必须处理和对象。WeakReferenceSoftReferencePhantomReference

唯一的参与是:WeakHashmap

  • 它创建并使用键的对象,以及WeakReference
  • 它清除其键已被 GC 清除的哈希表条目。WeakReferences

如果我很长一段时间没有引用密钥怎么办?

决定弱引用应被打破的标准不是基于时间的。

但是,时间可能会影响是否不删除密钥。例如,一个键可以1)不再是强引用,2)从地图中检索,3)分配给一个可访问的变量,使其再次被强引用。如果 GC 在键不可强访问的窗口中未运行,则键及其关联值将保留在地图中。(这是你想要发生的事情...)


1 - 实现细节:在最近的 Java 版本中,弱引用实际上指的是映射的内部 Entry 对象,而不是键。这样可以更有效地从映射中清除损坏的引用。有关详细信息,请查看代码。
2 - 软引用是一种在堆内存不足时允许 GC 中断的引用。


答案 2

Java有一个引用系统,语言可以告诉你的代码某个对象是否仍在使用中。您可以使用引用来检测某个对象何时被明确标识为不再使用或可用,然后可以采取相应的操作。本教程对参考文献进行了深入介绍,以防您好奇如何使用它们。

在内部,可能使用这些引用来自动检测何时无法再使用给定的键。然后,实现可以从哈希表中删除这些对象,以便它们不再占用任何空间。WeakHashMap

希望这有帮助!


推荐