Visual Studio Performance Profiler "Force GC" 按钮实际上在做什么?
What is the Visual Studio Performance Profiler "Force GC" button actually doing?
我正在尝试使用 Visual Studio Performance Profiler
来追踪我的应用程序中的内存泄漏
我使用探查器来:
- 执行操作
- 快照
- 强制 GC
- 再次快照
而且我看到我所有的对象垃圾都被正确收集了。
我做同样的事情,但使用我的应用程序:
- 执行操作
- 快照
使用代码在运行时强制 GC:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
再次快照
但是这次对象没有被回收,还在内存中。
那么 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
编译器指令包装了它,因为我认为这不是建议的做法,但为了寻找内存泄漏,它工作得很好
我正在尝试使用 Visual Studio Performance Profiler
我使用探查器来:
- 执行操作
- 快照
- 强制 GC
- 再次快照
而且我看到我所有的对象垃圾都被正确收集了。
我做同样的事情,但使用我的应用程序:
- 执行操作
- 快照
使用代码在运行时强制 GC:
GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect();
再次快照
但是这次对象没有被回收,还在内存中。
那么 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
编译器指令包装了它,因为我认为这不是建议的做法,但为了寻找内存泄漏,它工作得很好