【问题标题】:Why memory fragmentation in new process?为什么在新进程中出现内存碎片?
【发布时间】:2015-12-09 14:20:34
【问题描述】:

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

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

下面显示了这个空闲内存的碎片,见图: Free memory fragmentation

那么为什么会存在这种碎片化呢?我认为当进程启动时,系统会给它最少的内存,然后在需要时增加它。但是在这张图片中,我们看到为 calc 保留内存,而这块内存是碎片化的。为什么??

【问题讨论】:

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

标签: memory memory-management


【解决方案1】:

我认为将 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)可以解决大部分问题。因此,除非您使用例如分配外部资源P/Invoke 内存泄漏在 .NET 应用程序中应该很少见。

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

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

【讨论】:

    猜你喜欢
    • 2011-04-15
    • 1970-01-01
    • 2011-07-11
    • 2013-08-14
    • 1970-01-01
    • 2010-10-26
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多