2010-02-26 43 views
4

虽然试图用托管nt服务重现报告的问题,但我注意到性能计数器“Jitted方法数量”不断增加(连同“IL字节数Jitted”)。报告的行为包括大量的内存(不一定是机器上可用的所有内存)并消耗100%的CPU。对此nt服务的请求(通过wcf)通常会导致超时,即超过90秒。 (这些请求源于同一台机器上的一个asp.net站点。)应该如何解释性能计数器“Jitted方法”?

经过15分钟预热时间后,数值为127k(3610kb),经过一小时后为246k(6427kb),即增加119k jitted方法。

我不认为这是单独的这种行为导致报告的问题,因为报告的运行时间之前破坏只有几个小时。

但是,我仍然对如何解释这[显然]不断增加的数字感兴趣。虽然每小时只有3 MB,但每周将达到500 MB。而且,任何人都知道“IL字节数”是否是垃圾收集的主题?

(期间拍摄20分钟的时间写这篇文章的方法的人数增加了33K,和字节数与〜300K)

澄清,我应该提到第一次
事...;)

  • 我们没有创建,加载或卸载任何应用程序域的代码。
  • 我们没有发现任何东西,并且使用C#3,所以没有动态对象。
  • 我们使用NHibernate和AutoMapper,都使用反射来解决他们的目标。但是,我认为这些库行为良好,并且不会导致这种行为。 (在那里的任何工具,它让我看到的即时编译哪些方法?)

变化

  • 删除的代码行数和实时编译的方法数之间的比较。 Oded指出,该计数器还包括.NET Framework中的方法。

回答

1

jitted的行数包括框架和第三方库代码。

这不是C#,VB.NET行,而是CIL行,它们有更多的行 - 这可能足以解释这种差异。

3

可能有很多原因为什么一个进程会继续检查代码。如果您在特定AppDomain中加载程序集,则如果您在另一个AppDomain中加载程序集(除非程序集加载为域中立),将重新编译相同的方法。

生成和运行动态方法也会导致所有新方法的连接。

垃圾收集。 GC仅清理管理的对象堆。 Jitted代码存储在AppDomain的代码堆中,因此不会被GC收集。卸载AppDomain将摆脱该域的代码堆。

这个帖子有更多的细节http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

更新:关于工具

的WinDbg + SOS救援中心会告诉你哪些方法已经每种类型即时编译。使用!dumpmt -md。您还可以使用!dumpdomain命令查看每个AppDomain中加载了哪些模块。但是,它可能需要一点点挖掘才能找到您要查找的细节。