<分区>
我只是想知道在 .NET 运行时/C# 中是否有垃圾收集器开始/结束的可覆盖回调。我还要声明,我无意尝试控制 GC,我只是好奇。
如果不是,复制此行为的最佳方法是什么?
<分区>
我只是想知道在 .NET 运行时/C# 中是否有垃圾收集器开始/结束的可覆盖回调。我还要声明,我无意尝试控制 GC,我只是好奇。
如果不是,复制此行为的最佳方法是什么?
最佳答案
您无法直接在托管代码中获得通知,因为托管代码在 GC 期间被挂起(或者至少不能保证在 background GC 的情况下运行您的线程)。
选项:
您可以通过 GC.RegisterForFullGCNotification 获得大概的通知如图所示 Garbage Collection Notifications文章。
如果您需要大概的时间,可以查看与 GC 相关的性能计数器。
您还可以捕获 ETW 事件以离线分析行为 - Garbage Collection ETW Events .有很多关于如何做到这一点的链接 - Windows Performance Toolkit和诸如 Consuming "Event Tracing for Windows" events 之类的问题.
如果真的有必要,您可以自己托管 CLR,然后您会收到有关 GC 的通知 - 请参阅 CLR Indie Out:Hosting CLR和 CLR Hosting - part 3 .托管 CLR 以捕获 GC 开始/结束时所需的 final方法 - IHostGCManager::SuspensionStarting .
关于C# 垃圾收集器开始/结束回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30425872/