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

.NET 6 ASP.NET Core WebAPI配置并发GC为何显示Concurrent:False?

问题:配置并发GC后输出Concurrent为False的原因

项目配置与测试内容

.csproj配置

<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <ServerGarbageCollection>true</ServerGarbageCollection>
    <ConcurrentGarbageCollection>true</ConcurrentGarbageCollection>
  </PropertyGroup>
</Project>

Program.cs测试代码

Console.WriteLine($"Server:{System.Runtime.GCSettings.IsServerGC} LatencyMode:{System.Runtime.GCSettings.LatencyMode} Concurrent:{GC.GetGCMemoryInfo().Concurrent}");

实际输出

Server:True LatencyMode:Interactive Concurrent:False

原因解析

  • GC.GetGCMemoryInfo().Concurrent的含义误解
    这个属性并非反映当前GC是否启用了并发模式,而是记录最近一次垃圾回收是否以并发方式执行。程序启动初期如果还未触发过并发GC,或者最近一次GC是阻塞式的,该值就会显示为False。

  • Server GC下并发GC的触发逻辑
    Server GC默认启用并发模式(你通过ConcurrentGarbageCollection设置为true也符合默认行为),但并发GC不会在程序启动时立刻执行,只有当堆内存使用达到阈值、满足特定回收条件时才会触发。

  • 验证并发GC是否启用的方法
    可以通过以下方式确认:

    1. 强制触发一次并发GC后再查看结果,修改测试代码:
      // 强制触发一次并发的2代回收
      GC.Collect(2, GCCollectionMode.Forced, true, true);
      Console.WriteLine($"Server:{System.Runtime.GCSettings.IsServerGC} LatencyMode:{System.Runtime.GCSettings.LatencyMode} Concurrent:{GC.GetGCMemoryInfo().Concurrent}");
      
      此时Concurrent应该会显示为True。
    2. 检查GCSettings.IsServerGC为True的情况下,只要未通过GC.TryStartNoGCRegion等方法禁用并发,并发GC就是处于启用状态的,Interactive延迟模式也支持并发GC。

内容的提问来源于stack exchange,提问作者vtscop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:18