Joh*_*man 13 java garbage-collection weakhashmap data-structures
我最近发现了WeakHashMap
Java中的数据结构.
但是,我不明白它的意思是垃圾收集不再正常使用时的映射.数据结构如何知道我将不再使用我的程序中的密钥?如果我长时间没有提到钥匙怎么办?
Ste*_*n C 17
但是,我不明白它的意思是垃圾收集不再正常使用时的映射.
好.在正常情况下,当垃圾收集器运行时,它将删除程序无法再使用的对象.技术术语是"无法访问的对象",这意味着程序执行无法再获取对象的引用.无法访问的对象可以在下一个GC循环中收集......或者不收集.无论哪种方式,它都不再是应用程序的关注点.
在这种情况下,WeakHashMap
使用一个称为WeakReference
引用键的特殊类.弱引用是一种对象,其行为类似于间接指针(指向持有指针的对象的指针).它有一个有趣的特性,垃圾收集器可以打破引用; 即替换它包含的引用null
.且规则是一个弱引用的对象将被破坏时,GC通知该对象不再可达经由正常(强)或软引用的链1.
短语"不再正常使用"实际上意味着关键对象不再强烈或轻柔地可达; 即通过一系列强大和/或软的参考.
数据结构如何知道我将不再使用我的程序中的密钥?
在WeakHashmap
没有做到这一点.相反,它是GC注意到密钥不是很强的可达.
作为其正常遍历的一部分,GC将查找并标记所有可强制到达的对象.然后它遍历所有WeakReference
对象并检查它们所引用的对象是否已被标记,如果没有则将它们分开.(或类似的东西......我从来没有看过实际的GC实现.而且它必须处理SoftReference
和PhantomReference
对象这一事实使它变得复杂.)
唯一的参与WeakHashmap
是:
WeakReference
对象的对象,和WeakReferences
清除其密钥已被GC清除的哈希表条目.如果我长时间没有提到钥匙怎么办?
决定弱引用应该被打破的标准不是基于时间的.
但是,时序可能影响是否不删除密钥.例如,密钥可以1)不再是强引用,2)从地图中检索,3)被分配给可到达的变量,使其再次被强烈引用.如果GC在密钥不可达的窗口期间未运行,则密钥及其关联值将保留在映射中.(这是你想要发生的......)
1 - 软引用是一种在堆内存不足时允许GC中断的引用.
归档时间: |
|
查看次数: |
6206 次 |
最近记录: |