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

问题描述 投票:0回答:2

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

我意识到我可以调查 exe.config 并手动检查它,我只是想知道是否有一个属性位于某处,无需进行黑客攻击即可公开此信息。

c# .net garbage-collection
2个回答
7
投票

可悲的是,看起来没有内置方法,如果有的话,我希望在这里看到它:

System.Runtime.GCSettings.

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

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

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

无论如何,我做了一些研究,从 .Net 4 开始,你可以使用 ETW 来检测垃圾收集 ETW 事件:

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

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

更新:

    bool isServerGC = GCSettings.IsServerGC;

    Console.WriteLine($"Server GC Enabled: {isServerGC}");

    // if concurrent GC is enabled:
    if (!isServerGC)
    {
        Console.WriteLine("Running in Workstation GC mode.");
        // On Workstation GC, concurrent GC is generally enabled by default.
        Console.WriteLine("Concurrent GC Enabled: Likely enabled.");
    }
    else
    {
        Console.WriteLine("Concurrent GC is not used in Server GC mode.");
    }

使用 App.Config 您可以启用它或使用 EnvVar

COMPlus_gcConcurrent=1
:

<configuration>
    <runtime>
        <gcConcurrent enabled="true" />
    </runtime>
</configuration>

7
投票

如果

System.Runtime.GCSettings.LatencyMode
的值为
LatencyMode.Batch
,则并发 GC 已被禁用。

© www.soinside.com 2019 - 2024. All rights reserved.