为什么多次调用GC.Collect()会释放一些通常不会被清理的内存?
本文关键字:常不会 内存 释放 调用 GC Collect 为什么 | 更新日期: 2023-09-27 18:09:49
我在GC中发现了一件奇怪的事情,当我的应用程序删除了对许多大对象的引用时,它仍然会消耗大量内存,在我的情况下大约是300mb。即使我调用GC.Collect()
然后我尝试在几秒钟内随机调用它10次,结果:200mb的ram被释放,导致我的应用程序只吃100mb而不是300mb的私有ram(不是虚拟的,而是物理/常驻ram)
为什么会这样?我如何使GC自动清理内存而不必手动调用它?
-
您仍然持有对某个大对象的引用,因此即使调用
GC.Collect
也无法清除它。 -
非托管内存占该内存消耗的大部分。
当需要更多内存时,垃圾收集器将收集任何未使用的对象。对象只有在没有引用时才未使用。使用内存分析器来查看哪些对象占用了您的内存,以及为什么不收集它们。
除此之外,你不应该需要调用GC.Collect
。
今天有很多关于SO的GC问题!
也许过了那么久它就会把它清理干净。如果你的程序内存不足,没有这个额外的调用就停止了运行,请保留它,否则它可能是不必要的。