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

Ala*_*lan 10 .net collections clr memory-management

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

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

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

谢谢

Ree*_*sey 13

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

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

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

有关LOH的详细信息,这是一篇很棒的博客文章.

  • Dictionary的实现是一个合并的散列表(链接,但是使用一个数组来存储链接的桶,以便获得开放寻址的一些优点,就缓存使用而言),所以40k它们将包含一个内部数组40000*(keysize + valuesize + 8 [用于记忆哈希码的int和用于存储链中下一个索引的一个])和40000*4(int size)的内部数组.40000实际上至少是43627,可能多达90523,取决于成长的历史,因为它使用预先计算的素数.因此,肯定会...... (2认同)