2

我在 GC 中发现了一件奇怪的事情,当我的应用程序删除了对许多大对象的引用时,它仍然会消耗很多内存,在我的情况下大约 300mb。即使我打电话也不会清理这个内存GC.Collect()

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

为什么是这样?如何让 GC 自动清理此内存而无需手动调用它?

4

3 回答 3

4

任何一个:

  1. 您仍然在某处保留对大对象的引用,因此即使调用GC.Collect也无法清理它。

  2. 非托管内存占此内存消耗的大部分。您没有正确处置该非托管资源。

于 2013-04-18T18:33:24.940 回答
0

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

反正过了这么久,也许它会清理它。如果您的程序内存不足并在没有额外调用的情况下死亡,请将其保留,否则可能没有必要。

于 2013-04-18T18:38:47.570 回答
0

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

除此之外,您永远不需要打电话GC.Collect。垃圾收集器不仅有能力而且经过优化,可以选择何时执行。

于 2013-04-18T18:33:53.067 回答