【发布时间】:2013-04-18 18:30:10
【问题描述】:
我在 GC 中发现了一件奇怪的事情,当我的应用程序删除了对许多大对象的引用时,它仍然会消耗大量内存,在我的情况下大约 300mb。即使我调用GC.Collect(),这块内存也不会被清理
然后我尝试在几秒钟内随机调用它 10 次,结果:释放了 200mb 的内存,导致我的应用程序只吃 100mb 而不是 300mb 的私有内存(不是虚拟的,而是物理/常驻内存)
这是为什么?如何让 GC 自动清理此内存而无需手动调用?
【问题讨论】:
-
您的对象有多大?超过 85,000 字节?如果是这样,它们就在大对象堆上。 GC 对 LOH 的规则与对其他内存的规则不同。如果它们在 LOH 上,您可能正在查看内存碎片。
-
您可以使用 sos.dll msdn.microsoft.com/en-us/library/bb190764.aspx 查看内存中哪些对象是活动的,哪些对象持有对它们的引用。这可能有助于缩小导致您观察的原因
-
我不能使用sos,因为我有Visual Studio的免费版本,但是我的对象通常不是那么大,其中大部分,有些可能是