我想知道弱引用在内部是如何工作的,例如在 .NET 或 Java 中。我的两个总体想法是:
- “侵入式”——向最顶级类(对象类)添加弱引用列表。然后,当一个对象被销毁时,所有的弱引用都可以被迭代并设置为空。
- “非侵入式”- 维护一个指向弱引用列表的对象指针的哈希表。当对对象 B 创建弱引用 A 时,哈希表中会修改或创建一个条目,其键将是指向 B 的指针。
- “脏”- 为每个对象存储一个特殊的散列值,当对象被销毁时该散列值将被清零。弱引用会复制该散列值并将其与对象的值进行比较以检查对象是否存在。然而,当直接使用时,这会导致访问冲突错误,因此我认为需要一个具有该散列值的附加对象。
这些解决方案中的任何一个看起来都不干净也不高效。有谁知道它实际上是如何完成的?
最佳答案
在 .NET 中,当创建 WeakReference
时,GC 会被要求提供代表引用的句柄/不透明 token 。然后,在需要时,WeakReference
使用此句柄询问 GC 该句柄是否仍然有效(即原始对象仍然存在)——如果有效,它可以获得实际的对象引用。
所以这是针对对象地址构建 token /句柄列表(并且可能在碎片整理等期间维护该列表)
我不确定我是否 100% 理解这三个项目符号,所以我犹豫要不要猜测哪一个(如果有的话)最接近。
关于java - 弱引用是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/780738/