在尝试使用托管的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。)
澄清
我第一次应该提到的事情......;)
更改
答案 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行,这是更多的行 - 这可能足以说明差异。