【问题标题】:C# Large object in medium size collectionC# 中型集合中的大对象
【发布时间】:2015-12-01 15:10:32
【问题描述】:

我对内存问题还很陌生。希望您不要认为这是一个愚蠢的问题。

我知道大于 85,000 字节的内存会被放入 C# 中的 LOH 即

Byte[] hugeByteCollection = new Byte[85000]; 

我想知道是否会将大小为 10000 - 20000 且对象包含 10 个成员变量(字节类型)的集合放入 LOH 或 SOH 中?

【问题讨论】:

    标签: c# .net large-object-heap


    【解决方案1】:

    对象数组的大小是对象数乘以指针大小。这是因为只有值类型存储在数组本身中,引用类型(对象)将存储在其他地方并且不会计入数组的大小。因此 85000/4=21250 个对象和 85000/8=10625 个对象可以分别以 32 位和 64 位模式存储在 SOH 上的数组中。

    编辑: 感谢 Hans Passant 指出这假设使用的集合类型是数组而不是列表。列表调整自己的大小以大于内容以避免过多的分配。详情见this link

    【讨论】:

    • 那种数学不适用于集合类型,它实际上是 16,384。详情请查看this answer
    • 感谢您的评论!您谈论的调整大小仅适用于列表,而不是数组,因此与此问题没有直接关系。但是,我应该添加警告
    • 所以为了在 SOH 中保留包含大量对象的列表的列表,我们需要提出一个包含列表数组的分区列表。 partitionList 会在列表超过 10000 的容量时动态创建一个新的 List 并添加到 arry 中会这样吗?
    • 会的。但是,一旦您的列表达到该大小,LOH 是更快的选择。我不明白您为什么要坚持将其保留在 SOH 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多