拥有大量小类的GC含义是什么?

时间:2017-05-23 20:34:54

标签: c# .net performance garbage-collection

如果我有一个包含数十万个条目的多维数组,并且所有条目都是长期存在的类对象(即只创建一次并在应用程序的整个持续时间内生效),是否有任何GC含义我需要考虑?这会影响GC完成所需的时间吗?这会影响未来的分配/解除分配吗?

对于上下文,我试图在使用大量类或大量结构之间做出决定。

2 个答案:

答案 0 :(得分:1)

如果这些小类是长寿的,它们很快就会升级为Gen2对象,不会影响Gen0和Gen1集合。它们不会影响分配。它们会影响Gen2集合,但如果GC正在进行Gen2集合,那么你会遇到另外一个问题。你的内存不足了。

除了影响GC之外,class vs struct还会影响对象的内存布局。这将影响CPU缓存性能,这可能会对性能产生更大的影响。

答案 1 :(得分:1)

Large Object Heap(LOH)中分配的足够大的对象不会像常规堆分配那样被收集。 LOH中的对象不会正常压缩,因此更容易结束碎片化的内存,因此,即使您的进程根本没有使用大量内存,也很容易获得OutOfMemoryException(我的经验是虽然在处理大量大型对象时,在32位进程上返回700MB可能很容易遇到这种情况。)

我询问未来分配的原因是,如果这是您在程序中预期的唯一大型对象,并且不经常与其他人一起重新分配,那么拥有一个或几个可能不是什么大不了的事情对你影响太大拥有诸如海量数组或大字符串之类的大对象是可以的。如果需要LOH的分配足够频繁,则可能是一个问题。

结构与对象。对象显然使数组的宽度与指针的大小相同 - 即32或64位。结构可以作为值本身存储在数组中,因此如果结构较大,则元素相同大小的数组将按字节方式更大。因此,较少数量的元素将导致数组被分配到LOH中。