(几乎)所有的垃圾收集都是完全收集
本文关键字:几乎 | 更新日期: 2023-09-27 18:14:56
在大约四天的时间里,我一直在收集一个托管应用程序的性能计数器。在此期间,有以下垃圾收集:
- 第0代:133,695
- 第一代:133,413
- 第二代:133,254
其中一些是使用GC.Collect()
"诱导"的完整收集。四天有323人。
为什么我所有的集合都是完整的集合?我猜这种情况导致了一个非常高的"GC中%时间"计数器(超过70%,即使分配的字节/秒显著下降)。
需要注意的是,我正在运行。net 4.0, 64位,并且根据配置文件使用服务器GC。
我正在分配大量内存(有时超过300 MB/秒)
这足以解释你所观察到的。这将在这一秒内触发许多收集,第0代和第1代堆不是那么大。这些代中的对象很有可能仍然在使用,因为它们刚刚被分配,所以第0代和第1代收集没有提供足够的空间,几乎每个对象都被提升到第2代。GC对此有一个对策,它会自动增加生成大小。但这跟不上你对记忆的渴求。您可以使用Perfmon.exe中的. net内存性能计数器来观察这一点。任何。net内存分析器也会用更漂亮的图表给你更深刻的认识。
以如此高的速率分配内存并不容易,您必须分配大量数组。这本身就可以解释,大于85,000字节的数组被分配到大对象堆中。寻找重用这些数组的方法。几乎所有。net集合类都在底层使用数组。