Visual Studio Performance Profiler "Force GC" 按钮实际上在做什么?

What is the Visual Studio Performance Profiler "Force GC" button actually doing?

我正在尝试使用 Visual Studio Performance Profiler

来追踪我的应用程序中的内存泄漏

我使用探查器来:

  1. 执行操作
  2. 快照
  3. 强制 GC
  4. 再次快照

而且我看到我所有的对象垃圾都被正确收集了。

我做同样的事情,但使用我的应用程序:

  1. 执行操作
  2. 快照
  3. 使用代码在运行时强制 GC:

    GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();

  4. 再次快照

但是这次对象没有被回收,还在内存中。

那么 Force GC 按钮和我调用的代码 GC.Collect() 有什么区别?

非常感谢@Lass V. Karlsen 用这条评论为我指明了正确的方向:

一想就明白了。

我的 Page 正在自行处理,在我调用的 Dispose 方法中:

GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();

当然,因为当时页面仍然存在,所以没有被垃圾回收。

我的解决方案是改为执行以下操作:

#if DEBUG
     Task.Run(async () =>
     {
         await Task.Delay(500);                   
         GC.Collect();
         GC.WaitForPendingFinalizers();
         GC.Collect();
     });
#endif

注意我用 DEBUG 编译器指令包装了它,因为我认为这不是建议的做法,但为了寻找内存泄漏,它工作得很好