将大小超过85kB的集合放在大对象堆上吗?

时间:2015-03-18 08:25:43

标签: .net memory-management

我有一个关于何时将对象放入小型和大型对象堆中的问题。

我有两个大小小于85kB的字符串,我将其添加到集合中,例如List。字符串的总大小超过85kB。

此集合是作为小对象堆的一部分还是作为大对象堆的一部分处理?我认为这将是SOH,但我不确定。

1 个答案:

答案 0 :(得分:1)

如果集合是任何大小的List<TReference>,那么它就是SOH。如果集合是TReference[],其大小<= 20k,32位元素,或10位元素,64位(32位参考的大小是4字节,64位是8字节),它是SOH。

对象的大小不是根据对象X +对象X引用的所有对象计算的,而只是通过&#34; direct&#34; X的大小。

为什么List<TReference>TReference[]之间存在差异?因为数组(技术上是单维,0基索引数组)是IL语言直接支持的唯一可变长度数据类型。几乎所有其他集合类型只是对T[]数组(或一堆T[]数组)的引用以及一些支持数字字段。例如,List<T>是对T[]int Length的引用。

SOH与LOH的关键是&#34;将它移动到记忆中的速度是多少?#34;?清楚:

public class MySmallClass
{
    public byte[] WithABigObject = new byte[1024*1024];
}

移动BigObject(字节数组)会非常慢,移动MySmallClass(简单地由引用组成)非常快,因为它具有引用的大小: - )

请注意,在C#中创建不具有&gt; = 85k大小的数组的对象非常困难,因为正如我所说,在IL语言直接支持的类型之间,数组的大小可变。每种其他类型都有固定的尺寸,非常小。您需要在内部创建一个22k int的类来制作没有数组的LOH: - )

没有数组的LOH对象示例:https://ideone.com/OuVkEs。它基于多级KeyValuePair<,>(一个struct),在最低级别使用Guid(最常用的struct)。结果BigGuid128k是128k的struct。通过将它包含在你的班级中,你的班级将变成一个LOH :-)

相关问题