弱引用是如何实现的?

2022-09-02 13:28:16

我想知道弱引用在内部是如何工作的,例如在.NET或Java中。我的两个一般想法是:

  1. “侵入性” - 将弱引用列表添加到最顶级的类(对象类)中。然后,当对象被销毁时,可以迭代所有弱引用并将其设置为 null。
  2. “非侵入式” - 维护对象指向弱引用列表的指针的哈希表。当创建对对象 B 的弱引用 A 时,哈希表中将有一个已修改或创建的条目,其键将是指向 B 的指针。
  3. “Dirty” - 为每个对象存储一个特殊的哈希值,当对象被销毁时,该哈希值将被清零。弱引用将复制该哈希值,并将其与对象的值进行比较,以检查对象是否处于活动状态。但是,当直接使用时,这会导致访问冲突错误,因此我认为需要一个具有该哈希值的附加对象。

这些解决方案中的任何一个似乎都很干净,也不高效。有谁知道它实际上是如何完成的吗?


答案 1

在 .NET 中,创建 时,会要求 GC 提供表示引用的句柄/不透明标记。然后,在需要时,使用此句柄询问GC该句柄是否仍然有效(即原始对象仍然存在) - 如果是这样,它可以获得实际的对象引用。WeakReferenceWeakReference

因此,这是针对对象地址构建令牌/句柄列表(并可能在碎片整理等过程中维护该列表)

我不确定我是否100%理解这三颗子弹,所以我犹豫着要猜哪个(如果有的话)最接近。


答案 2

不确定我是否理解了您的问题,但您可以查看Java中弱引用类及其超类引用的实现。它有很好的注释,你可以看到它有一个由GC专门处理的字段和另一个由VM直接使用的字段。


推荐