Do null引用类型变量会影响垃圾收集器(GC)性能

本文关键字:收集器 GC 性能 引用 null 类型变量 影响 Do | 更新日期: 2024-09-22 03:54:08

IIRC,.NET Framework中基于生成的垃圾收集器,通过扫描进程的内存寻找引用来确定哪些对象仍然存在。参考类型变量的数量(特别是那些已设置为null的变量)是否会影响此扫描的速度?

例如,在我的应用程序中,我正在设计一种网格容器,期望它存储大量空的Cell。由于Cell(在本例中)包含一个引用类型变量,因此Cell的每个实例都会将+1添加到我的应用程序中的引用类型变量的数量中。

struct Cell { public SomeReferenceType objRef; }

如果这些细胞中只有一小部分具有objRef而不是null,我是否无意中损害了GC的性能?

Do null引用类型变量会影响垃圾收集器(GC)性能

通常跟踪GC可以分为两部分:检查可达性和删除不可达对象。当你只创建更多的引用而没有添加任何不可访问的对象时,你不会影响第二部分所需的工作,但必须访问每个(可访问的)引用,以确定整个对象图的可达性。这是假设结构是可访问的(如果它们不是,例如,因为它们是孤立数组的一部分,所以永远不会访问它们)。

也就是说,这项工作很小,是一个单指针比较和一个条件分支(如果大多数引用确实是null,则可以正确预测)。如果这些structs是一个大数组的一部分(这是我看到你在不引入许多其他非null引用的情况下获得大量structs的唯一方法),那么情况会更糟。

非null引用更昂贵,因为GC必须跟随它(->潜在的缓存未命中),并可能遍历通过所述引用可访问的大型对象子图(->大量额外工作)。