c# - .Net 垃圾收集器中写入障碍的详细信息

标签 c# .net arrays garbage-collection

我有一个很大的T[]在大对象堆上的第 2 代中。 T是引用类型。我做以下作业:

T[0] = new T(..);

  • 在 GC 的下一个 Gen0/Gen1 标记阶段,哪些对象被标记为脏?整个数组实例,或只是 T 的新实例?下一个 Gen0/Gen1 GC 标记阶段是否必须遍历数组的每一项? (这似乎是不必要的,而且效率很低。)
  • 数组在这方面有什么特殊之处吗?如果集合是例如,它会改变答案吗?一个SortedList<K, T>我添加了一个新的最大项目?

我已经通读了许多问题和文章,包括下面的那些,但我认为我仍然没有找到明确的答案。 我知道整个内存范围都被标记为脏,而不是单个对象,但是新的数组条目或数组本身是它的基础吗?

card table and write barriers in .net GC

Garbage Collector Basics and Performance Hints

最佳答案

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/

相关文章:

C# XAML InputScope ="Number"出现不需要的特殊字符

java - Java 的 NumberFormatException 的 .NET 等价物是什么?

c# - Auto Patcher(高效的自动更新程序)

c++ - 通过 vector 下标访问 Fortran 数组,cpp 等效

java - 如何在文本文件中的单独行中打印数组列表

WPF 中的 C# 和 XAML – 它们如何协同工作?

c# - JsonConvert.Deserializer 索引问题

javascript - 在 Javascript 中将对象键从一个对象映射/过滤到一个新对象

c# - Newtonsoft.Json DLL 版本与 signalR + WEBAPI 冲突

c# - 标签上的透明标签