当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《.NET集合和大对象堆(LOH)》经验,为你挑选了1个好方法。

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

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

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

谢谢



1> Reed Copsey..:

如果对象超过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,取决于成长的历史,因为它使用预先计算的素数.因此,肯定会......
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有