You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 05:55:15