Memory 为什么在新进程中出现内存碎片?

Memory 为什么在新进程中出现内存碎片?,memory,memory-management,Memory,Memory Management,帮助我了解下一种情况。 我有32位的Windows2003。启动windows calculator(calc)并运行实用程序VMMap()以使用计算器查找内存 VMMap显示此进程的可用内存为 免费2068224K 下图显示了此可用内存的碎片,请参见图片: 那么,为什么会存在这种分裂呢?我认为当进程启动时,系统会给它最少的内存,然后在需要时增加内存。但在这张图片中,我们看到了calc的保留内存,而这个内存是零碎的。为什么??< /P> < P>我认为在Windows Server 2003中

帮助我了解下一种情况。 我有32位的Windows2003。启动windows calculator(calc)并运行实用程序VMMap()以使用计算器查找内存

VMMap显示此进程的可用内存为 免费2068224K

下图显示了此可用内存的碎片,请参见图片:


那么,为什么会存在这种分裂呢?我认为当进程启动时,系统会给它最少的内存,然后在需要时增加内存。但在这张图片中,我们看到了calc的保留内存,而这个内存是零碎的。为什么??< /P> < P>我认为在Windows Server 2003中比较Cal.EXE与C应用程序是不相关的,因为大多数时候Cal.Exe都是用C++编写的。在像Windows10这样的较新的操作系统中,它会更相关,因为我认为calc.exe是一个.NET应用程序

.NET/C#对内存管理几乎没有控制,因为通过垃圾收集器(GC)可以进行自动内存管理。在我职业生涯之初,我来自C/C++,我认为这是一件好事,因为内存泄漏非常罕见。对于分配非.NET资源的.NET应用程序,您仍然需要进行一些管理,但是使用IDisposable接口的Dispose模式(请参阅)解决了大部分问题。因此,除非您使用P/Invoke等方式分配外部资源,否则.NET应用程序中应该很少出现内存泄漏

如果为许多对象分配了不同的生命周期,则.NET中的内存可能会出现碎片,因为当临时对象被解除分配/垃圾回收并且长寿命对象保持在原位时,可能会出现内存缺口。但这是.NETGC优化和整理分配内存以确保有尽可能少的间隙的事情


我认为您真正的问题是OutOfMemoryExceptions,而不是碎片。如果要分配大量内存,则这可能是一个限制因素。32位.NET应用程序的最大内存为1.4 GB。但更可能的是,您的问题不是实际的内存不足问题。请发布一个新问题,详细说明您分配的数据类型,在OutOfMemoryExceptions发生时共享stacktrace以及任何相关代码。

我知道有些系统需要运行旧的操作系统版本,但对Windows Server 2003的支持已于2015年7月14日结束。你真的应该考虑离开那个12岁的操作系统。我也认为这是离题的,因为这不是编程。这是计算器的例子。但在现实中,我有自己的c#应用程序存在这样的问题。可用内存非常零碎,出现OutOfMemory错误。所以我试着去理解这个问题,好吧,但最好是问你想问的问题,而不是讨论calc。我试着在我的答案中回答你的碎片问题。