为什么新进程中的内存碎片化?

时间:2015-12-09 14:20:35

标签: memory memory-management

帮助我了解下一个情况。 我有Windows 2003 32位。启动Windows计算器(计算)并运行实用程序VMMap(https://technet.microsoft.com/en-us/sysinternals/vmmap.aspx)以使用计算器查看内存。

VMMap显示此进程的可用内存为 免费2 068 224 K

及其下方显示此可用内存的碎片,请参见图片: Free memory fragmentation

那么为什么存在这种碎片呢?我认为当进程启动时,系统会给它最小的内存,然后在需要时增加它。但是在这张图片中,我们看到了用于计算的保留内存,并且这个内存是碎片化的。为什么?

1 个答案:

答案 0 :(得分:0)

我不认为将calc.exe与Windows Server 2003中的C#应用​​程序进行比较是相关的,因为当时很可能是calc.exe是用C ++编写的。在像Windows 10这样的新操作系统中,它会更相关,因为我认为calc.exe是一个.NET应用程序。

.NET / C#几乎无法控制内存管理,因为通过垃圾收集器(GC)进行自动内存管理。在我的职业生涯开始时来自C / C ++,我认为这是一种祝福,因为内存泄漏更加罕见。对于分配非.NET资源的.NET应用程序,您仍然需要进行一些管理,但使用IDisposable接口的Dispose模式(请参阅https://en.wikipedia.org/wiki/Dispose_pattern)可以解决这些问题。因此,除非您使用例如分配外部资源。在.NET应用程序中,P / Invoke内存泄漏应该很少见。

如果许多对象分配了不同的生命周期,则内存可能会在.NET中碎片化,因为当临时对象被释放/垃圾收集并且长寿命对象保留在原位时,可能会出现内存空白。但这是.NET GC为分配的内存进行优化和碎片整理以确保尽可能少的差距。

我认为您的真正问题是OutOfMemoryExceptions而不是碎片。如果要分配大量内存,那么这可能是一个限制因素,32位.NET应用程序的最大内存为1.4 GB。但更有可能的是,您的问题不是实际的内存不足问题。请发布一个新问题,其中包含您分配的数据类型的详细信息,在发生OutOfMemoryExceptions异常时分享您的堆栈跟踪以及任何相关代码。