弱哈希映射如何知道垃圾收集对象?

Joh*_*man 13 java garbage-collection weakhashmap data-structures

我最近发现了WeakHashMapJava中的数据结构.

但是,我不明白它的意思是垃圾收集不再正常使用时的映射.数据结构如何知道我将不再使用我的程序中的密钥?如果我长时间没有提到钥匙怎么办?

Ste*_*n C 17

但是,我不明白它的意思是垃圾收集不再正常使用时的映射.

好.在正常情况下,当垃圾收集器运行时,它将删除程序无法再使用的对象.技术术语是"无法访问的对象",这意味着程序执行无法再获取对象的引用.无法访问的对象可以在下一个GC循环中收集......或者不收集.无论哪种方式,它都不再是应用程序的关注点.

在这种情况下,WeakHashMap使用一个称为WeakReference引用键的特殊类.弱引用是一种对象,其行为类似于间接指针(指向持有指针的对象的指针).它有一个有趣的特性,垃圾收集器可以打破引用; 即替换它包含的引用null.且规则是一个弱引用的对象被破坏时,GC通知该对象不再可达经由正常(强)或软引用的链1.

短语"不再正常使用"实际上意味着关键对象不再强烈或轻柔地可达; 即通过一系列强大和/或软的参考.

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

WeakHashmap没有做到这一点.相反,它是GC注意到密钥不是很强的可达.

作为其正常遍历的一部分,GC将查找并标记所有可强制到达的对象.然后它遍历所有WeakReference对象并检查它们所引用的对象是否已被标记,如果没有则将它们分开.(或类似的东西......我从来没有看过实际的GC实现.而且它必须处理SoftReferencePhantomReference对象这一事实使它变得复杂.)

唯一的参与WeakHashmap是:

  • 它创建并使用WeakReference对象的对象,和
  • WeakReferences清除其密钥已被GC清除的哈希表条目.

如果我长时间没有提到钥匙怎么办?

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

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


1 - 软引用是一种在堆内存不足时允许GC中断的引用.