Skip to content
横幅:.NET 10 的 GC,还会“卡死”整个程序吗?

.NET 10 的 GC,还会“卡死”整个程序吗? ​

先给一个不太令人放心但诚实的答案:

会。

.NET 10 的 GC,在某些时刻仍然会暂停整个程序。这个“暂停全世界”的动作,在 GC 圈子里有个专门的名字——Stop-The-World(STW)。

但别急着皱眉头。真正值得说的是下一句:这种完全阻塞的时间,已经被压缩得非常短了。

短到什么程度?在不少场景里,它已经不是性能瓶颈,而是你可以忽略的那一小段噪声。

为什么 GC 非要“停下来”? ​

要理解这件事,先得接受一个事实:GC 不是不想并发,而是有些活必须停下来才能干。

最典型的是两件事:

根扫描。 GC 要回收垃圾,先得知道哪些对象还活着。活着的对象通过“根”被引用——线程栈、寄存器、静态变量。要准确读取这些东西,就必须让所有托管线程暂停一下,否则你一边读、它一边改,读出来的就是一笔糊涂账。

根修复。 如果 GC 决定压缩堆——把对象搬家、消除内存碎片——那么搬完之后,所有指向这些对象的引用都得更新。这也必须停。

所以“阻塞”不是设计缺陷,而是安全的代价。

哪些阶段还在“冻结世界”? ​

在 GC 的整个流程里,真正需要 STW 的只有少数几个关键点:

  • 根扫描:回收开始时,短暂暂停所有线程,扫一遍栈和寄存器
  • 根修复:如果要压缩堆(移动对象),得再暂停一次,更新所有引用
  • 前台 Gen0/Gen1 回收:小对象回收通常很快,但依然是阻塞式的

注意“短暂”这个词。这几个阶段的设计目标,就是把暂停压缩到极短,而不是让它消失。

.NET 10 是怎么把暂停越压越短的? ​

核心思路一句话就能概括:把原本要 STW 的漫长阶段,尽可能改成跟应用程序并发执行。

后台 GC 成为主力 ​

耗时的 Gen2(老年代)回收,.NET 10 默认走后台 GC。它会在专用后台线程上并发标记、并发清扫,你的应用线程在这期间可以继续跑。

只有在根扫描和根修复这些必须同步的瞬间,应用才暂停。有资料显示,这种机制可以把 Gen2 回收的总暂停压到 0.2ms 左右。

0.2 毫秒是什么概念?一次普通的网络请求往返,都比它长得多。

并发扫除 ​

扫除阶段(真正释放内存的环节)现在也扩展到了后台执行,减少了 Gen2 和大对象堆(LOH)的暂停时间。据称可减少 20% 到 30% 的 GC 暂停。

硬件指令集的加持 ​

.NET 10 在底层做了两件事:

针对 Arm64 优化了写屏障技术,并结合 Intel AVX10.2 和 Arm64 SVE 指令集做硬件加速。

官方给出的数据是:GC 暂停时间从 250ms 降到 120ms,降幅 52%。在 Arm64 架构下,暂停耗时还能再减 8% 到 20%。

DATAS 默认启用 ​

DATAS 全称 Dynamic Adaptation To Application Sizes,直译过来是“动态适配应用规模”。

它做的事情是根据应用的实际负载动态调整堆大小,目标是维持一个合理的“吞吐量成本百分比”,从而更智能地控制 GC 的触发频率和暂停时长。

说白了,就是不再用一套固定参数应对所有场景,而是让 GC 自己看着办。

什么情况下,还是会卡很久? ​

尽管优化做到这个程度,下面这几种情况依然可能引发明显的、甚至长时间的阻塞:

死锁或运行时缺陷。 极少数情况下,GC 的挂起机制可能和运行时其他部分撞上。比如在 Linux 上启用 DOTNET_PerfMapEnabled 时,曾出现过 GC 挂起机制与代码片段堆之间的死锁。Server GC 也出现过因线程死锁导致无限期挂起的情况。

强制完全阻塞回收。 如果你在代码里显式调用 GC.Collect() 并指定了阻塞模式,或者系统内存压力极大,触发了完全阻塞的 Gen2 回收——那阻塞时间该长还是长。

Finalizer 线程繁忙。 如果终结器线程被大量耗时任务堵住,内存没法及时回收,就会间接引发更频繁、更长时间的 GC。

总结一下 ​

在 .NET 10 里,GC 依然会“冻结世界”,但它的目的变成了:用极短的静止,换取内存状态的一致。

对于绝大多数高吞吐的 Web 服务或微服务,这个暂停已经被控制在毫秒级甚至亚毫秒级。它不再是你需要天天担心的事。

当然,如果你的应用确实对延迟极其敏感,还是可以自己动手验证。用 dotnet-counters 监控这两个指标:

  • GC.PauseDuration
  • GC.ConcurrentPauseDuration

数据不会说谎。

下次再有人问你“GC 会不会卡死程序”,你可以这样回答:

会。但它卡的时间,已经短到你可能根本察觉不到了。

Released under the MIT License.