【问题标题】:Error in a Wikipedia Article on memory leaks [closed]关于内存泄漏的维基百科文章中的错误[关闭]
【发布时间】:2011-08-07 01:40:25
【问题描述】:

this wikipedia 文章的末尾,在“C 中的一个简单示例”一节中声称​​“操作系统会延迟实际内存分配,直到将某些内容写入它”。根据我的经验,这是不可能的,或者说“不可行”。操作系统/处理器不会跟踪每个内存写入。维基百科的文章是否像我怀疑的那样有误?如果不启发我。

编辑

我想当考虑到页面错误时,它在某些方面确实是有意义的。然而,页面错误和虚拟内存并不适合讨论内存泄漏。我的意思是,如果进程分配 2 个页面,写入一个(第一页),然后泄漏两个页面,无论天气如何,它仍然是泄漏,第二个页面是否泄漏物理内存。我想该部分应该区分物理内存和虚拟内存? :D

【问题讨论】:

  • 写得很笨拙,但很准确。虚拟内存按需映射到 RAM,第一次访问内存页面会产生页面错误。

标签: c operating-system memory-management


【解决方案1】:

取决于操作系统。例如,在 Linux 上,它实际上确实是这样工作的。查找“乐观内存分配”。

除此之外,还有虚拟内存和物理内存的区别。在大多数操作系统上,您使用的是虚拟内存,因此即使您分配了许多兆字节的内存,实际的物理内存也只会在您写入后才会被利用(此时之前在该位置的内容可能会被调回到磁盘)。

“虚拟地址空间”基本上只是“逻辑”内存,然后映射到物理 RAM(或您的硬盘,如果内存已被分页)。

【讨论】:

  • 是的,但那是在页面级别。我应该回避歧义=D
  • 您在这里谈论的是两个不同的层。内存泄漏发生在更高级别,即您分配了一定数量的虚拟字节并且从不释放它们。它们是如何分页的以及何时分页完全无关紧要。
【解决方案2】:

你错了。

操作系统必须分配的只是虚拟内存。你打电话给mmapbreak。它创建一些虚拟地址空间,并设置页表条目以导致页面错误。你开始引用内存,页面错误发生,系统开始进行真正的内存分配。以前没有。

【讨论】:

    【解决方案3】:

    我会说评论至少与 内存泄漏 无关,即使它没有错误。内存使用量至少有 3 次测量:

    • 消耗的虚拟地址空间
    • 提交费用
    • 物理内存占用

    即使分配的内存没有被页面错误物理实例化,它仍然会占用宝贵的虚拟地址空间和提交费用。

    【讨论】:

      【解决方案4】:

      假设您分配了 1GB 的虚拟内存,但实际上只引用和使用了 0.5GB,您仍然泄漏了 0.5GB 的分配地址空间。即使它不占用实际的实际 RAM,它仍然需要来自内存分配器的资源来管理您的分配(尤其是当您分配了许多小对象时)。所以它仍然是内存泄漏,因为(至少在 32 位上)您最多只能分配额外的 1GB。而不是 1.5GB,而且您无法从应用程序中释放它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 2018-03-22
        • 1970-01-01
        相关资源
        最近更新 更多