我有一个很大的T[]
在大对象堆上的第 2 代中。 T
是引用类型。我做以下作业:
T[0] = new T(..);
- 在 GC 的下一个 Gen0/Gen1 标记阶段,哪些对象被标记为脏?整个数组实例,或只是
T
的新实例?下一个 Gen0/Gen1 GC 标记阶段是否必须遍历数组的每一项? (这似乎是不必要的,而且效率很低。) - 数组在这方面有什么特殊之处吗?如果集合是例如,它会改变答案吗?一个
SortedList<K, T>
我添加了一个新的最大项目?
我已经通读了许多问题和文章,包括下面的那些,但我认为我仍然没有找到明确的答案。 我知道整个内存范围都被标记为脏,而不是单个对象,但是新的数组条目或数组本身是它的基础吗?
最佳答案
Which object(s) are marked as dirty for the next Gen0/Gen1 mark phases of GC? The entire array instance, or just the new instance of T?
包含数组开头的 128B block 将被标记为脏。新创建的实例 ( new T()
) 将是一个新对象,因此将首先通过没有卡片表的 Gen 0 集合进行检查。
为简单起见,假设数组的开头对齐在 128B 边界上,这意味着前 128B 将无效,因此假设 T
是引用类型并且您使用的是 64 位系统,这是下一次收集期间要检查的前 16 项。
Will the next Gen0/Gen1 GC mark phase have to go through every item of the array? (That would seem unnecessary and very inefficient.)
只是这 16 到 32 个项目,具体取决于此架构中的指针大小。
Are arrays special in this regard? Would it change the answer if the collection were e.g. a SortedList and I added a new, maximal item?
数组并不特殊。 SortedList<K,T>
在内部维护两个数组,因此在一般情况下更多的 block 最终会变脏。
关于c# - .Net 垃圾收集器中写入障碍的详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47828243/