【发布时间】:2011-07-11 13:59:54
【问题描述】:
我正在使用 Red Gates ANTS 内存分析器来调试内存泄漏。它一直在警告我:
内存碎片可能导致 .NET 保留过多的可用内存。
或
内存碎片正在影响可以分配的最大对象的大小
因为我有强迫症,这个问题必须解决。
有哪些标准编码做法有助于避免内存碎片。 你能通过一些.NET 方法对其进行碎片整理吗?它甚至会有所帮助吗?
【问题讨论】:
-
这将有助于了解这是什么类型的应用程序。如果您将内存固定(或使用在后台固定 I/O 缓冲区的 I/O 函数)、从本机分配器(例如 COM 任务分配器)进行分配或创建大量大型对象,则会发生内存碎片,因为LOH 没有被压缩。 .NET 垃圾收集器已经压缩了代际动态分配,这具有对可用空间进行碎片整理的副作用。如果这没有发生,那是因为某些东西阻止了对象被移动。
-
因为我有强迫症,这个问题必须解决。 + 1 仅用于此评论 - 我其实很喜欢这个问题
-
卸载那些讨厌你但对诊断问题没有帮助的工具。内存碎片是生活中的一个事实,没有什么可以阻止它,这不会是非常不切实际的。低碎片堆分配器已经是 Vista 及更高版本的默认设置。无论如何,如果你分配了超过一半的可用地址空间,这只是一个问题,猪不会飞。
-
@Hans - 低碎片堆与专门托管的代码无关 - 托管堆根本不使用本机堆。不过,您的其余评论完全正确。
-
@Stewart - 大多数碎片都是由非托管代码引起的。有很多,即使在纯托管程序中也是如此。 GC 几乎不会产生碎片,因为它会压缩堆,这是非托管代码无法做到的。
标签: c# .net memory-management memory-leaks fragmentation