DA0005:频繁进行 GC2 收集

规则 ID

DA0005

类别

.NET Framework 使用

分析方法

.NET 内存

消息

在第 2 代垃圾回收中正在收集多个对象。

消息类型

警告

原因

在第 2 代垃圾回收中正在回收大量 .NET 内存对象。

规则说明

Microsoft .NET 公共语言运行时 (CLR) 提供了自动内存管理机制,该系统使用垃圾回收器从应用程序不再使用的对象回收内存。 垃圾回收器是面向代的,并假定许多分配的生存期都较短。 例如,本地变量的生存期应比较短。 新创建的对象从第 0 代 (gen 0) 开始,然后如果这些对象在运行垃圾回收后仍然存在,则它们进入第 1 代,最后如果应用程序仍然使用这些对象,则它们最终进入第 2 代。

第 0 代的对象常被收集而且通常收集效率非常高。 第 1 代的对象收集得较少而且收集效率较低。 最后,应更少地收集第 2 代生存期长的对象。 第 2 代回收运行的是完整垃圾回收,也是最消耗资源的操作。

如果发生第 2 代垃圾回收的发生率过高,则会激发此规则。 如果在第 1 代回收后仍然存在太多生存期相对较短的对象,但随后可以在第 2 代完整回收中进行回收,则内存管理的成本可能很容易会变得过高。 有关更多信息,请参见 MSDN 网站上 Rico Mariani's Performance Tidbits(Rico Mariani 关于性能问题的见解)上的 Mid-life crisis(生存期中期危机)一文。

如何调查警告

请查看分析工具 .NET 内存数据视图报告以了解应用程序的内存分配模式。 使用“对象生存期”视图确定存在于第 2 代中,然后从此代被回收的程序数据对象。 使用 .NET 内存分配视图确定导致这些分配的执行路径。

有关如何提高垃圾回收性能的信息,请参见 Microsoft 网站上的 Garbage Collector Basics and Performance Hints(垃圾回收器基础知识和性能提示)。 有关自动垃圾回收的开销的信息,请参见 Large Object Heap Uncovered(大型对象堆揭密)。