.NET集合和大对象堆(LOH)

时间:2009-03-30 17:18:26

标签: .net memory-management collections clr

具有大量项目的.NET集合是否易于存储在LOH中?

我特别对List和Dictionary感到好奇。在我的代码中,我将大量(40k +)相对较小的对象(比如1k)存储在临时列表和Dictionarys中进行处理。这些藏品中的物品数量是否会增加被放置在LOH上的可能性?

对于列表,假设List是作为双向链表实现的,那么元素的数量不应该增加实际List对象的大小,但我想知道。

由于

4 个答案:

答案 0 :(得分:13)

如果超过85,000字节,对象将仅存储在LOH上。一个大的列表(特别是结构)通常会在这里分配。

然而,Dictionary的可能性较小,因为它们存储了一个桶阵列,因此除非生成足够的桶以使阵列变为> 85000字节,否则不太可能。一个40k元素的列表将存储在LOH上,即使它们是类(因为每个元素中的对象引用将导致列表在x86上为160k,在x64系统上为320k)。但是,各个元素将位于标准堆上,因此会被压缩等等。

如果您使用双向链表而不是标准列表,则它不太可能存储在LOH上。列表的每个元素都很小(只有一个节点,引用了下一个/前一个节点),因此没有一个对象将是> 85k字节。

有关LOH的详情,this is a great blog entry.

答案 1 :(得分:4)

System.Collections.Generic.List在内部实现为数组,而不是链接列表。是的,如果集合的大小很大,它将被分配在大对象堆上(请注意,数组的大小很重要,如果你有一小部分大型引用类型,它将不会在LOH上分配)。

答案 2 :(得分:4)

列表实现为数组。因此,数组将被放入LOH,但List对象本身不会。

同样基本上也适用于Dictionary。它也在内部使用一组桶,它们基本上存储了你添加的键/值对。

答案 3 :(得分:0)

Dictionary为键/值有O(LOG N)向量,所以在40K +对象中你很安全。 如前所述,List实现为数组,因此大型列表确实在LOH上。 您可以查看object is on the LOH using SOS