我有一个关于何时将对象放入小型和大型对象堆中的问题。
我有两个大小小于85kB的字符串,我将其添加到集合中,例如List。字符串的总大小超过85kB。
此集合是作为小对象堆的一部分还是作为大对象堆的一部分处理?我认为这将是SOH,但我不确定。
答案 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 :-)