clr的原因! PerfView CPU 堆栈中的 JIT_New

Posted

技术标签:

【中文标题】clr的原因! PerfView CPU 堆栈中的 JIT_New【英文标题】:Causes of clr ! JIT_New in PerfView CPU stack 【发布时间】:2013-06-04 01:48:48 【问题描述】:

我正在使用 PerfView 来调整应用程序,第二个最昂贵的项目当前标记为:

其他 >

超过 10% 的 CPU。即使对于测试用例的后续运行,这种情况也会继续。

谁能确定哪些活动或代码实践可能导致需要 JIT-ting 的新代码的动态生成?

【问题讨论】:

【参考方案1】:

JIT_New() 是 CLR 中的一个辅助函数,只要您使用 new 运算符在代码中创建新对象,该函数就会运行。它只是从垃圾收集堆中分配内存并调用类构造函数。或者换句话说,它实现了 Opcodes.Newobj IL 指令。它的名字有点令人困惑,它与 jitting 你的代码没有任何关系。 jitter 知道的只是一个辅助函数,它将对这个辅助函数的调用直接编译成生成的机器代码。 JIT_Newarr1() 将是您遇到的另一个,它分配一个数组。

我不知道 PerfView,请注意 JIT_New() 的执行时间可能包括执行垃圾回收所需的时间。当 JIT_New() 运行时 gen#0 堆已满时会发生这种情况。这可以解释很大的百分比,否则 JIT_New() 非常快。您对此无能为力,这是任何托管程序中的固定开销。

【讨论】:

如果您认为JIT_New() 包括垃圾收集所用时间的假设是正确的(我相信它是正确的),那么严格来说,“您对此无能为力”并不完全正确:在在很多情况下,值得在良好的memory profiler 下运行程序并弄清楚如何创建更少的对象(即更少的垃圾)。较高的“% time in GC”性能计数器可能表明程序编写不佳。 谢谢。我不相信任何垃圾收集包括在内;我正在创建大量小的临时对象,我可能可以将它们转换为 structs。您是否知道在结构上实现 IEquatable 是否会产生装箱开销?我最近看到了一些建议。 @BradleyGraingerL 反思一下,您可能是正确的。我将检查设计的这方面。

以上是关于clr的原因! PerfView CPU 堆栈中的 JIT_New的主要内容,如果未能解决你的问题,请参考以下文章

全能程序员系列(十三)--性能分析工具PerfView的使用

垃圾回收

PerfView专题 (第七篇):如何洞察触发 GC 的 C# 代码?

PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化

PerfView专题 (第三篇):如何寻找 C# 中的 VirtualAlloc 内存泄漏

PerfView专题 (第二篇):如何寻找 C# 中的 Heap堆内存泄漏