当前位置 : 主页 > 网络安全 > 测试自动化 >

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

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

经过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中加载了哪些模块.但是,可能需要花一些时间来寻找您正在寻找的细节.

网友评论