2011-03-09 79 views
42

我正在使用Red Gates ANTS内存分析器来调试内存泄漏。它不断告诫我:在.NET中导致内存碎片的原因

内存碎片可能导致 .NET预留太多空闲内存。

内存碎片的影响,可分配

因为我有强迫症的最大对象的大小,这个问题必须解决。

什么是有助于避免内存碎片的标准编码实践。 你可以通过一些.NET方法对其进行碎片整理吗?它甚至会有帮助吗?

+6

更多信息这将有助于有什么样的应用程序,这是一些信息。如果您离开内存固定(或使用I/O功能,在后台插入I/O缓冲区),从本地分配器(如COM任务分配器)分配或创建大量大对象,则会发生内存碎片,因为LOH不会被压缩。 .NET垃圾收集器已经压缩了分代动态分配,这对分配可用空间有副作用。如果没有发生,那是因为某些东西阻止了对象被移动。 – 2011-03-09 03:12:03

+28

*因为我有强迫症,所以必须解决这个问题。* + 1仅用于这个评论 - 我实际上喜欢这个问题,尽管 – BrokenGlass 2011-03-09 03:12:45

+9

卸载那些婊子的工具,但对诊断问题没有帮助。内存碎片是生活中的事实,没有什么可以做到的,以防止它不会太不切实际。低碎片堆分配器已经是Vista及更高版本的默认设置。无论如何,如果你分配超过一半的可用地址空间,这只是一个问题,猪不会飞。 – 2011-03-09 03:35:15

回答

9

你知道,我有点怀疑这里的内存分析器。 .NET中的内存管理系统实际上会尝试通过移动内存来为你整理堆(这就是为什么你需要将内存固定到与外部DLL共享的原因)。

在较长时间段内进行大容量内存分配容易出现更多碎片。虽然小的短暂(短)内存请求不太可能导致.NET中的碎片。

这里还有一些值得思考的东西。使用.NET的当前GC,分配的内存时间紧密,通常在空间上紧密排列在一起。这与碎片化相反。即您应该按照您打算访问它的方式分配内存。

它仅仅是一个托管代码还是它包含像P/Invoke,非托管内存(Marshal.AllocHGlobal)或像GCHandle.Alloc(obj,GCHandleType.Pinned)之类的东西?

+6

GC不会压缩大对象堆,这是对象> 85KB存在的地方。一旦LOH分散,无法对其进行碎片整理。 – 2012-01-27 13:32:32

+0

从.NET 4.5.1m开始,有一种方法可以手动压缩LOH,但我会强烈建议不要这样做,因为它对您的应用程序来说性能很高。 https://blogs.msdn.microsoft.com/mariohewardt/2013/06/26/no-more-memory-fragmentation-on-the-net-large-object-heap/(同样,我推荐它) – 2017-08-09 18:19:59

10

GC堆对待大对象分配的方式不同。它不会压缩它们,而只是将相邻的空闲块(如传统的非托管内存存储)结合起来。

此处了解详情:http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

所以有非常大的对象,最好的策略就是一次分配他们,然后留住他们,重用他们。

+1

Out好奇心,我想知道为什么LOH对象大小不会被舍入到4096的下一个倍数?看起来这样可以促进在某些操作系统环境下的压缩(只需移动虚拟页面指针而不是复制内存),并且还可以大大减少碎片。由于LOH对象通常最少为85K,因此舍入到4K块的开销将为5%或更低。 – supercat 2011-03-18 16:04:45

6

.NET Framework 4.5.1能够在垃圾收集期间显式压缩大型对象堆(LOH)。

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce; 
GC.Collect(); 

GCSettings.LargeObjectHeapCompactionMode

+0

我强烈建议不要这样做,原因在于它对您的应用程序来说有巨大的性能提升,原因有两个: 1.耗时 2.它清除GC收集的任何分配模式算法你的应用程序的一生。在您的应用程序运行时,GC通过了解应用程序如何分配内存来调整自身。因此,它变得更有效率(到某个点),您的应用运行的时间越长。当你执行GC.Collect()(或任何它的重载)时,它会清除GC学到的所有数据 - 所以它必须重新开始。 – 2017-08-09 18:20:32

+0

@Dave Black,你在哪找到这样的信息? MSDN不包含有关LOH压缩对分配模式算法的影响的信息。 – 23W 2017-10-18 17:02:36

+1

@ 23W,我认识那些在团队中工作的人。 – 2017-10-19 05:19:50

相关问题