C# NonCurrentGC代替ForegroundGC

C# NonCurrentGC代替ForegroundGC,c#,garbage-collection,clr,C#,Garbage Collection,Clr,我正在查看一些简单C代码的结果,这些代码只向ArrayList添加了10 mil个元素(效率不是重点,我只是需要一些触发GCs的东西) 使用.NET Framework 4.7.2。GC在Windows 10 x64操作系统上以默认并发工作站模式运行 BenchmarkDotNet(BDN)用于分析代码,同时运行PerfView以收集GC信息。我只是简单地提到BDN,因为在代码运行之前和之后看到的诱导GC实际上都来自BDN;它在当前的问题中没有扮演其他角色 查看PerfView的GCStats数

我正在查看一些简单C代码的结果,这些代码只向ArrayList添加了10 mil个元素(效率不是重点,我只是需要一些触发GCs的东西)

使用.NET Framework 4.7.2。GC在Windows 10 x64操作系统上以默认并发工作站模式运行

BenchmarkDotNet(BDN)用于分析代码,同时运行PerfView以收集GC信息。我只是简单地提到BDN,因为在代码运行之前和之后看到的诱导GC实际上都来自BDN;它在当前的问题中没有扮演其他角色

查看PerfView的GCStats数据,只关注一次代码运行,我们得到以下输出:

让我们通过查看ETW事件本身,从PerfView中更仔细地了解上一次后台GC(
2B
)期间发生的情况:

正如所料,gen2 GC同时触发gen0(红色突出显示)和gen1 GC(绿色突出显示)。此外,来自Konrad Kokosa的书《Pro.NET内存管理》:“前台GC是常规的非并发GC,在此期间后台GC暂时挂起”

在这种情况下,为什么报告为非当前GC的gen0 GC没有实际标记为ForegroundGC,就像gen1 GC一样

这也不是一次性的:BGC gen2触发一个非并发gen0和前景gen1 GC的模式是重复的