如何检测并发GC是否在.Net中运行

Spe*_*nce 7 .net c# garbage-collection

是否有一个简单的函数调用来确定在运行的运行时中是否已启用Concurrent GC?我们有一个异构环境,我们需要记录正在使用的模式,以便我们确定需要修改哪些系统.

我意识到我可以调查exe.config并手动检查它,我只是想知道是否有一个属性坐在某个地方暴露这些信息而不必进行黑客攻击.

Jer*_*son 6

遗憾的是,它看起来并没有内置的方法,如果有的话,我希望在这里看到它:System.Runtime.GCSettings.

除非您有充分的理由,否则最好保留并发垃圾收集(作为默认设置)。

通常,唯一关心这一点的是托管 CLR 本身的非托管应用程序(例如 SQL Server 或 IIS)。

您的应用程序是否适合以编程方式更改 exe.config 中的 gcConcurrent?如果没有,就像你说的那样,从配置中读取值是一种不那么黑客的方式(恕我直言)。

尽管如此,我做了一些研究,从 .Net 4 开始,您可以使用ETW 来检测垃圾收集 ETW 事件

Windows 事件跟踪 (ETW) 是一个跟踪系统,它补充了 .NET Framework 提供的分析和调试支持。从 .NET Framework 4 开始,垃圾收集 ETW 事件 捕获有用的信息,以便从统计角度分析托管堆。例如,当垃圾收集即将发生时引发的 GCStart_V1 事件提供以下信息:

  • 正在收集哪一代的对象。
  • 是什么触发了垃圾收集。
  • 垃圾收集的类型(并发或非并发)


spr*_*y76 6

如果System.Runtime.GCSettings.LatencyMode具有该值,LatencyMode.Batch则已禁用并发GC.