.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是否启用的方法
可以通过以下方式确认:- 强制触发一次并发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。 - 检查
GCSettings.IsServerGC为True的情况下,只要未通过GC.TryStartNoGCRegion等方法禁用并发,并发GC就是处于启用状态的,Interactive延迟模式也支持并发GC。
- 强制触发一次并发GC后再查看结果,修改测试代码:
内容的提问来源于stack exchange,提问作者vtscop
相关产品推荐
相关产品推荐

