我应该在我的WPF应用程序中手动强制垃圾收集吗?

Ros*_*oss 11 .net wpf garbage-collection memory-leaks

我刚刚在WPF应用程序中整理了一些内存泄漏.为此,我使用了CLR分析器,以及在Windows任务管理器中查看进程统计信息.我的基本测试是确保当某个窗口关闭时,它仍然没有在内存中徘徊.

我对Windows开发有点新手,起初我很困惑,因为在一个简单的测试应用程序中,似乎无论如何,我的窗口在关闭后总是留在内存中.但我最终得出结论,这并不意味着存在内存泄漏,而只是简单地说它们还没有被垃圾收集.所以我不得不在我的主窗口中创建一个按钮,该按钮连接到一个事件处理程序,其中包含手动强制垃圾收集的代码.通过手动垃圾收集,我可以完成我的内存泄漏测试,我把它全部排序.

但它让我思考 - 是否需要手动强制垃圾收集?

当我打开和关闭窗口时,我很难看到我的应用程序的内存消耗量上升.当然,最终,垃圾收集会自动运行并且所有内容都会被整理出来.但在这些沉重的窗户关闭后,手动垃圾收集几乎是个好主意.但有什么意义吗?我觉得测试放在一边,我们不应该强制垃圾收集 - 只需让系统对其进行排序.

思想赞赏.

Ros*_*oss 11

谢谢你们的反馈.我会同意你的建议,让系统注意系统的设计目的!

我实际上已经在.NET框架的书中找到了一个很好的答案.它说:

.NET垃圾收集器的全部目的是代表我们管理内存.但是,在一些非常罕见的情况下,以编程方式强制使用垃圾收集可能是有益的GC.Collect().特别:

  • 当您的应用程序即将进入一个您不希望被可能的垃圾收集中断的代码块时.
  • 当您的应用程序刚刚完成分配极大量的对象并且您希望尽快删除所获取的内存时.


Fel*_*ano 5

在任何.NET应用程序中,最好不要手动强制进行垃圾回收.GC应该比我们最聪明(实际上它很聪明).不幸的是,如果存在内存泄漏,即使强行调用GC也无济于事.

  • +1 表示“如果存在内存泄漏,即使强行调用 GC 也无济于事”。这是一个很好的观点......泄漏的对象不是垃圾收集的候选对象。 (2认同)