基于Perfview分析.NET 4.7.1程序GC长暂停与BLOCKED_TIME的疑问
问题解答
1. Gen2 GC期间托管代码是否完全停止?
是的,在2522.622ms至14793.193ms这段时间窗口内,你的单线程托管程序会完全停止执行业务代码。
.NET的Gen2 GC(Full GC)属于Stop-the-World(STW)类型的垃圾回收:当Full GC触发时,CLR会挂起所有托管线程,暂停所有托管代码的执行,直到GC完成内存回收、对象整理等操作后,才会恢复线程执行。你的程序是单线程托管程序,自然也会被完全挂起,这段时间内不会执行任何业务逻辑。
2. 为何Thread Time堆栈会出现多个指向clr!JIT_New的不同函数?
这是由PerfView的采样机制和你的程序特性共同导致的:
clr!JIT_New的角色:它是CLR为托管代码中new关键字生成的底层分配入口——你的业务代码里任何创建对象的操作,最终都会调用到这个CLR内部函数。- GC触发时的线程状态:你的程序是计算密集型低IO类型,必然会频繁分配对象。当Full GC触发的瞬间,主线程可能正处于业务代码中不同的对象分配路径上(比如不同的业务函数里执行
new操作)。 - PerfView采样逻辑:
BLOCKED_TIME的采样是捕捉线程被阻塞前的最后执行上下文,而非单一的阻塞入口点。在采样周期内,针对这个长GC窗口的多次采样,会记录下主线程被挂起前的不同业务调用栈——这些栈的顶层是不同的业务函数,但最终都会指向clr!JIT_New这个对象分配的底层入口,因此你会看到约20个不同的函数堆栈。
内容的提问来源于stack exchange,提问作者Kevin Kostrzewa
相关产品推荐
相关产品推荐

