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

C# 如何检测并发GC是否在.Net中运行,c#,.net,garbage-collection,C#,.net,Garbage Collection,是否有一个简单的函数调用来确定我运行的运行时中是否启用了并发GC?我们有一个异构的环境,我们需要记录正在使用的模式,以便我们可以确定哪些系统需要修改 我意识到我可以调查exe.config并手动检查它,我只是想知道是否有一个属性位于某个地方,它可以在不进行黑客攻击的情况下公开此信息。遗憾的是,它看起来不像是有一个烘焙的方法,如果我希望在这里看到它的话:System.Runtime.GCSettings. 除非您有充分的理由,否则最好保持并发垃圾收集处于打开状态(默认情况下) 通常,唯一关心这一点

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


我意识到我可以调查exe.config并手动检查它,我只是想知道是否有一个属性位于某个地方,它可以在不进行黑客攻击的情况下公开此信息。

遗憾的是,它看起来不像是有一个烘焙的方法,如果我希望在这里看到它的话:
System.Runtime.GCSettings.

除非您有充分的理由,否则最好保持并发垃圾收集处于打开状态(默认情况下)

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

您的应用程序是否适合以编程方式更改exe.config中的gcConcurrent?如果不是的话,看起来就像你说的,从配置中读取值是一种不那么粗俗的方式(IMHO)

尽管如此,我做了一些研究,从.Net 4开始,您可以使用:

Windows事件跟踪(ETW)是一个跟踪系统,它补充了 .NET Framework提供的分析和调试支持。 从.NET Framework 4开始, 捕获有用的信息,以便从 统计观点。例如,GCStart_V1事件 在即将进行垃圾回收时引发,提供 以下资料:

  • 正在收集哪一代对象
  • 是什么触发了垃圾收集
  • 垃圾收集的类型(并发或非并发)
如果
System.Runtime.GCSettings.LatencyMode
具有值
LatencyMode.Batch
,则并发GC已被禁用。

垃圾收集通知未接收回调是衡量GC是否并发的一种相当不精确的方法…它看起来像是配置文件的一部分。你看到我问题的最后一句话了吗?我知道我可以尝试读取exe.config,但我想知道是否有更可靠的方法。其次,在可执行文件启动后可以更改此文件,因此如果可能的话,它不如检查正在运行的软件那么可靠。感谢您的全面回答。内存泄漏搜索:(你不能将内存泄漏探查器与并发GC连接,所以我们需要有选择地启用它来尝试和连接。这是我见过的最接近的一次