|
|
1
5
不确定我理解了你的问题,但是你可以看看Java中的类弱引用及其超类引用的实现。它有很好的注释,您可以看到它有一个由GC专门处理的字段,另一个字段由VM直接使用。 |
|
2
6
在.NET中,当
因此,这是针对对象地址构建一个令牌/句柄列表(并可能在碎片整理等过程中维护该列表)。 我不确定我100%理解这三颗子弹,所以我不知道哪颗(如果有的话)是最接近的。 |
|
|
3
3
弱引用的实现在业界似乎是保密的;-)。例如,到目前为止, wikipedia article 缺少任何实现细节。看看上面的答案(包括接受的答案):“去看看来源”或“我想”;—\。 在所有的答案中,只有一个引用了python的pep 205是有洞察力的。正如它所说,对于任何一个对象,如果我们把weakref看作一个实体本身,那么最多只能有一个弱引用。 其余部分描述了松鼠语言的实现。所以,weakref本身就是一个对象,当你把弱引用放到某个容器中的对象时,你实际上把引用放到weakref对象中。每个ref countable对象都有一个字段来存储指向其weakerf的指针,在实际请求weakerf之前,该字段为空。每个对象都有方法来请求weakerf,它要么从字段返回现有(singleton)weakerf,要么创建它并在字段中缓存。 当然,Weakref指向了原始的物体。因此,您只需浏览所有处理对象引用的可用位置,并添加对weakerefs的透明处理(即自动取消引用)。(“透明的”替代方法是添加虚拟的“访问”方法,该方法将是大多数对象的标识,并实际取消对weakref的引用。) 当对象有指向其weakerf的指针时,对象就可以在自己的析构函数中使weakerf无效。 这个实现非常干净(没有“调用GC”之类的魔力),并且有O(1)运行时成本。当然,这是非常贪婪的内存——需要向每个对象添加+1指针字段,即使通常90%以上的对象为空。当然,vhls对于每个对象已经有很大的内存开销,并且可能有机会压缩不同的“额外”字段。例如,对象类型通常是一个小的枚举,因此可以将类型和某种weakerf引用合并到单个机器字中(例如,将weakerf对象保留在单独的区域中,并使用索引)。 |
|
|
4
2
蟒蛇 PEP 205 对弱引用在Python中的行为有一个很好的解释,这让我们对如何实现它们有了一些了解。因为弱引用是不可变的,所以每个对象只能有一个,您可以根据需要将引用传递给它。因此,当对象被破坏时,只需要一个弱引用无效。 |
|
|
5
0
我认为,通常的方法是系统维护一些弱引用列表。当垃圾收集器执行时,在删除死对象之前,系统将遍历弱引用列表,并使目标未被标记为活动的任何引用无效。根据系统的不同,这可能发生在系统临时恢复符合立即完成条件的对象之前或之后(对于.NET,有两种
顺便说一下,如果我设计一个基于GC的框架,我会添加一些其他优点:(1)声明引用类型的方法
存储位置
作为一个主要对其他人感兴趣的参考,以及(2)各种
|
|
|
dongyoung heo · 选择执行工作时MySQL磁盘I/O 9 年前 |
|
ndnenkov · git如何跟踪文件更改 11 年前 |
|
|
Michael · gdb如何在共享库函数中设置软件断点? 12 年前 |
|
|
varnie · Perl内部和Moose:持续折叠优化 13 年前 |