规则 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(大型对象堆揭密)。