我只是想知道在.NET运行时/ C#中是否存在垃圾收集器开始/结束的可覆盖回调。我还要声明我无意试图控制GC,我只是很好奇。
如果没有,那么复制这种行为的最佳方式是什么?
答案 0 :(得分:6)
您无法直接在manged代码中获取通知,因为在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的开始/结束时所需的最终方法 - IHostGCManager::SuspensionStarting。