如何解释性能计数器“Jitted方法”?

时间:2010-02-26 13:34:52

标签: .net performance jit

在尝试使用托管的nt-service重现报告的问题时,我注意到性能计数器“Jitted方法”不断增加(连同“#It Bytes Jitted”)。报告的行为包括占用大量内存(不一定是机器上可用的所有内容)和消耗100%的CPU。对此nt-service(通过wcf)的请求通常会导致超时,即90秒以上。 (请求来自同一台机器上的asp.net站点。)

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

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

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

(在写这篇文章的20分钟内,方法的数量增加了33k,字节数增加了〜300k。)

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

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

更改

  • 删除代码行数和jitted方法数之间的比较。正如Oded指出的那样,计数器还包括.NET Framework中的方法。

2 个答案:

答案 0 :(得分:3)

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

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

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

这篇文章有其他详细信息http://blogs.msdn.com/cbrumme/archive/2003/06/01/51466.aspx

更新:关于工具

WinDbg + Sos将显示每种类型的jitted方法。使用!dumpmt -md。您还可以使用!dumpdomain命令查看每个AppDomain中加载了哪些模块。但是,可能需要花一些时间来寻找您正在寻找的细节。

答案 1 :(得分:1)

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

不是C#,VB.NET行,而是CIL行,这是更多的行 - 这可能足以说明差异。