Pavel Mayorov Asked:2020-09-11 13:52:06 +0800 CST2020-09-11 13:52:06 +0800 CST 2020-09-11 13:52:06 +0800 CST 什么是依赖句柄? 772 msdn "Analyze .NET Framework memory issues"的页面列出了 10 种根提示类型,但它们的描述是重言式的。 一种类型,从属句柄,被描述为“来自对象句柄表的从属对象”。它是什么? .net 1 个回答 Voted Best Answer Pavel Mayorov 2020-09-11T14:59:41+08:002020-09-11T14:59:41+08:00 正如VladD 引用的文章中所述,Dependent Handle 是一种特殊类型的引用,具有两个参数 - source 和 target,对于 source 它的行为类似于弱引用,而对于目标它的行为类似于强引用,但有一个例外:对目标的引用的来源不是依赖句柄本身,而是来源。换句话说,一个额外的弧被添加到对象图中。 此类链接是通过类创建的,该类System.Runtime.CompilerServices.ConditionalWeakTable<,>是一个哈希表。 同时,与传统的哈希表不同,即使是建立在弱链接上的哈希表,即使存在循环链接,ConditionalWeakTable也不会导致内存泄漏,这可以通过以下检查来验证: class BigObject { private static readonly ConditionalWeakTable<BigObject, BigObject> table = new ConditionalWeakTable<BigObject, BigObject>(); private readonly byte[] arr = new byte[1024 * 1024]; public BigObject() { table.Add(this, this); } } class Test { static void Main(string[] args) { for (int i = 0; i < 100000; i++) new BigObject(); Console.ReadKey(); } } 执行此代码后,如果哈希表使用通常对键的弱引用和对值的强引用,则执行程序将需要 100 GB 的内存。但这不会发生。
正如VladD 引用的文章中所述,Dependent Handle 是一种特殊类型的引用,具有两个参数 - source 和 target,对于 source 它的行为类似于弱引用,而对于目标它的行为类似于强引用,但有一个例外:对目标的引用的来源不是依赖句柄本身,而是来源。换句话说,一个额外的弧被添加到对象图中。
此类链接是通过类创建的,该类
System.Runtime.CompilerServices.ConditionalWeakTable<,>
是一个哈希表。同时,与传统的哈希表不同,即使是建立在弱链接上的哈希表,即使存在循环链接,ConditionalWeakTable也不会导致内存泄漏,这可以通过以下检查来验证:
执行此代码后,如果哈希表使用通常对键的弱引用和对值的强引用,则执行程序将需要 100 GB 的内存。但这不会发生。