在尝试使用托管的NT服务重现报告的问题时,我注意到性能计数器“Jitted方法”不断增加(连同“#It Bytes Jitted”).报告的行为包括占用大量内存(不一定是机器上可用的所有内容)和消耗100%
经过15分钟的预热时间后,该值为127k(3610kb),经过一小时后为246k(6427kb),即增加了119k jitted方法.
我不认为只是这种行为导致报告的问题,因为在服务破坏前报告的运行时间只有几个小时.
但是,我仍然对如何解释这个[显然]不断增加的数字感兴趣.虽然每小时只有3 mb,但每周500 MB.而且,任何人都知道“#It Bytes Jitted”是否是垃圾收集的主题?
(在写这篇文章的20分钟内,方法的数量增加了33k,并且字节数增加了~300k.)
澄清
我第一次应该提到的事情……;)
>我们没有创建,加载或卸载任何appdomains的代码.
>我们没有发射任何东西,使用C#3,所以没有动态对象.
>我们使用NHibernate和AutoMapper,都使用反射来解决他们的目标.但是,我认为那些库表现良好并且不会导致这种行为. (那里的任何工具都可以让我看到哪些方法被咬了?)
变化
>删除代码行数和jitted方法数之间的比较.正如Oded所指出的,计数器还包括.NET Framework中的方法.
可能有很多原因导致进程继续编写代码.如果在特定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中加载了哪些模块.但是,可能需要花一些时间来寻找您正在寻找的细节.