为什么多次调用GC.Collect()会释放一些通常不会被清理的内存?

本文关键字:常不会 内存 释放 调用 GC Collect 为什么 | 更新日期: 2023-09-27 18:09:49

我在GC中发现了一件奇怪的事情,当我的应用程序删除了对许多大对象的引用时,它仍然会消耗大量内存,在我的情况下大约是300mb。即使我调用GC.Collect()

,这个内存也不会被清理。

然后我尝试在几秒钟内随机调用它10次,结果:200mb的ram被释放,导致我的应用程序只吃100mb而不是300mb的私有ram(不是虚拟的,而是物理/常驻ram)

为什么会这样?我如何使GC自动清理内存而不必手动调用它?

为什么多次调用GC.Collect()会释放一些通常不会被清理的内存?

  1. 您仍然持有对某个大对象的引用,因此即使调用GC.Collect也无法清除它。

  2. 非托管内存占该内存消耗的大部分。

当需要更多内存时,垃圾收集器将收集任何未使用的对象。对象只有在没有引用时才未使用。使用内存分析器来查看哪些对象占用了您的内存,以及为什么不收集它们。

除此之外,你不应该需要调用GC.Collect

垃圾收集器在选择何时执行方面非常有能力和优化。

今天有很多关于SO的GC问题!

也许过了那么久它就会把它清理干净。如果你的程序内存不足,没有这个额外的调用就停止了运行,请保留它,否则它可能是不必要的。