Ima*_*ist 15 garbage-collection pointers weak-references
我一直在阅读垃圾收集,寻找包含在我的编程语言中的功能,我遇到了"弱指针".从这里:
弱指针就像指针一样,除了弱指针的引用不会阻止垃圾收集,弱指针必须在使用之前检查它们的有效性.
弱指针与垃圾收集器交互,因为它们引用的内存实际上可能仍然有效,但包含的对象与创建弱指针时的对象不同.因此,每当垃圾收集器回收内存时,它必须检查是否有任何引用它的弱指针,并将它们标记为无效(这不需要以这种天真的方式实现).
我以前从未听说过弱指针.我想支持我的语言中的许多功能,但在这种情况下,我不能为我的生活想到这将是有用的情况.对于什么会使用弱指针?
一个非常重要的是缓存.让我们考虑缓存如何工作:
缓存背后的想法是将对象存储在内存中,直到内存压力变得太大以至于某些对象需要被推出(或者当然显然无效).因此,您的缓存存储库对象必须以某种方式保留这些对象.通过弱引用保持它们,当垃圾收集器因为内存不足而寻找要消耗的东西时,仅由弱引用引用的项目将作为垃圾收集的候选者出现.当前正由其他代码使用的缓存中的项目将具有仍处于活动状态的硬引用,因此将保护这些项目免受垃圾回收.
在大多数情况下,您不会使用自己的缓存机制,但通常使用缓存.假设您想拥有一个引用缓存中对象的属性,并且该属性长时间保留在范围内.您更喜欢从缓存中获取对象,但如果它不可用,您可以从持久存储中获取它.如果压力过高,您也不希望强制该特定对象留在内存中.因此,您可以使用对该对象的弱引用,这将允许您在可用时获取它,但也允许它从缓存中删除.
典型的用例是存储其他对象属性.假设您有一个具有固定成员集的类,并且从外部开始,您希望添加更多成员.所以你创建了一个字典对象 - > attributes,其中键是弱引用.然后,字典不会阻止密钥被垃圾收集; 删除对象也应该触发删除WeakKeyDictionary中的值(例如通过回调).
如果您的语言的垃圾收集器无法收集循环数据结构,那么您可以使用弱引用来启用它.通常,如果您有两个彼此引用的对象,但没有其他外部对象引用这两个对象,则它们将成为垃圾回收的候选对象.但是,一个天真的垃圾收集器不会收集它们,因为它们包含对彼此的引用.
要解决这个问题,你要做到这一点,所以一个对象有一个强引用第二个,但第二个对第一个有弱引用.然后,当对第一个对象的最后一个外部引用消失时,第一个对象成为垃圾收集的候选对象,紧接着是第二个对象,因为现在它的唯一引用很弱.