(几乎)所有垃圾收集都是完整的集合

Mar*_*ark 2 .net c# garbage-collection

我在大约四天内一直在为托管应用程序收集性能计数器.在此期间,出现了以下垃圾收集:

  • 第0代:133,695
  • 第1代:133,413
  • 第2代:133,254

其中一些是使用"诱导"的完整集合GC.Collect().四天内共有323人.

为什么我的所有(或基本上所有)收藏品都是完整的收藏?我猜这种情况导致非常高的"GC时间"计数器(超过70%,即使分配的字节数/秒显着下降).

根据配置文件,我正在运行.NET 4.0,64位,并使用服务器GC,这可能是也可能不重要.

Han*_*ant 6

我正在分配大量内存(有时超过300 MB /秒)

这足以解释你观察到的内容.这将在第二天触发大量的集合,第0代和第1代堆不是那么大.这些世代中的对象很可能仍在使用中,因为它们刚被分配,因此第0代和第1代集合没有足够的空间,几乎每个对象都被提升为第2代.GC有一个对策,它会自动增加发电量.但这无法跟上你对记忆的贪婪饥渴.您可以使用Perfmon.exe中的.NET内存性能计数器来观察此情况.任何.NET内存分析器都可以为您提供更好的图表.

以如此高的速率分配内存并不容易,你必须分配大量的数组.这本身就可以解释它,大对象堆中分配了大于85,000字节的数组.寻找重用这些数组的方法.几乎所有.NET集合类都使用数组.