如何在.Net中检测拳击的原因?

Ale*_*lex 8 .net c# clr

摘要

我们必须了解我们(或第三方,可能是CLR本身)代码的哪一部分导致整数拳击.

问题描述

我们有一个相当大的应用程序,我们观察到System.Int32实例的高分配率.在Memory Profiler的帮助下,我们看到了少量长期存在的Int32实例(确切地说是18个)和Int32每秒20-25千个分配.所有这些对象都是GC收集为Gen0对象,系统没有内存泄漏,可以运行很长时间.创建内存快照时,GC会在快照之前执行,因此快照不包含这些"临时"对象的任何跟踪.

我们所有的代码都是专门为消除拳击而编写的,而且"按设计"我们根本不会看到拳击.因此我们怀疑它是我们的代码中的一些未消除的遗忘拳击,或由第三方组件和/或CLR类型本身引起的装箱.

系统使用VS2008编译,并使用.Net 3.5(测量在调试和发布版本中完成,具有相同的行为).

我们如何(使用windbg,VS2008,Memory Profiler,AQTime或任何其他商用产品)检测拳击发生的原因?

ewr*_*kin 2

我最喜欢的应用程序之一是 CLR Profiler,它将为您提供所需的内容,它将映射您的整个应用程序,显示不同的代。它可以从 Microsoft 免费下载,功能极其强大且易于使用。我还提供了一个如何使用它的链接。 (CLR 探查器下载) (如何使用 CLR 探查器)