代码之家  ›  专栏  ›  技术社区  ›  Baruch

应用程序内存泄漏是否会导致操作系统内存泄漏?

  •  27
  • Baruch  · 技术社区  · 14 年前

    当我们说一个程序泄露内存时,比如 新的 没有 删除 在c++中,它真的 泄漏 ? 我的意思是,当程序结束时,内存是否仍然分配给一些不运行的程序而不能使用,或者操作系统是否知道每个程序请求了什么内存,并在程序结束时释放它?如果我经常运行那个程序,我的内存会用完吗?

    9 回复  |  直到 9 年前
        1
  •  20
  •   Teekin    8 年前

    在具有受保护内存的操作系统(Mac OS 10+、所有Unix克隆(如Linux)和基于NT的Windows系统(即Windows 2000及更低版本)上,当程序结束时,内存将被释放。

    如果你经常运行任何一个程序而不在两者之间关闭它(同时运行越来越多的实例),不管是否存在内存泄漏,你最终都会耗尽内存,所以内存泄漏的程序也是如此。显然,泄漏内存的程序将比没有内存泄漏的相同程序更快地填满内存,但您可以在不填满内存的情况下运行它多少次,在很大程度上取决于程序正常运行所需的内存量,而不是是否存在内存泄漏。除非你在比较两个完全相同的程序,一个有内存泄漏,另一个没有内存泄漏,否则这种比较是毫无价值的。

    当程序运行很长时间时,内存泄漏会变得最严重。典型的例子是服务器软件,比如web服务器。例如,对于游戏、电子表格程序或文字处理程序,内存泄漏并没有那么严重,因为你最终会关闭这些程序,释放内存。但当然,内存泄漏是一种令人讨厌的小动物,应该始终作为一个原则问题加以解决。

    但如前所述,当程序关闭时,所有现代操作系统都会释放内存,因此即使出现内存泄漏,如果继续打开和关闭程序,也不会填满内存。

        2
  •  37
  •   aschepler    14 年前

    不,在所有实际操作系统中,当程序退出时,所有的资源都由OS回收。内存泄漏在可能持续运行较长时间的程序和/或可能经常从同一程序调用的函数中变得更为严重。

        3
  •  15
  •   Toon Krijthe    14 年前

    执行停止后,操作系统将返回泄漏的内存。

    这就是为什么它并不总是桌面应用程序的大问题,而是服务器和服务的大问题(它们往往运行很长时间)。

    让我们看看下面的场景:

    1. 从操作系统编程一个ask内存
    2. 操作系统将块X标记为已被A使用,并将其返回给程序。
    3. 程序应该有一个指向X的指针。
    4. 程序返回内存。
    5. 操作系统将块标记为空闲。现在使用块会导致访问冲突。
    6. 程序A结束,A使用的所有内存都标记为未使用。

    没什么问题。

    但是,如果在循环中分配内存而忘记删除,则会遇到真正的问题:

    1. 从操作系统编程一个ask内存
    2. 操作系统将块X标记为已被A使用,并将其返回给程序。
    3. 程序应该有一个指向X的指针。
    4. 转到1

    如果操作系统内存不足,程序可能会崩溃。

        4
  •  6
  •   nmichaels    14 年前

    不,一旦操作系统关闭程序,内存就会恢复(给一个相当现代的操作系统)。问题在于长时间运行的进程。

        5
  •  4
  •   Femaref    14 年前

    当进程结束时,内存也会被清除。问题是,如果一个程序泄漏内存,它将要求越来越多的操作系统运行,并可能导致操作系统崩溃。

        6
  •  4
  •   Joachim VR    14 年前

    从代码本身不再控制内存这一点来说,它更容易泄漏。

        7
  •  3
  •   mikej heading_to_tahiti    14 年前

    操作系统可以在程序结束时释放内存。如果程序中存在漏洞,那么程序运行时只是一个问题。对于长时间运行的程序(如服务器进程),这是一个问题。或者,如果你的web浏览器有内存泄漏,并且你让它运行了几天,那么它将逐渐消耗更多的内存。

        8
  •  3
  •   jdecuyper    14 年前

    据我所知,在大多数操作系统上,当一个程序启动时,它接收到一段定义好的内存,一旦程序结束,内存将被完全释放。

    内存泄漏是垃圾收集器算法发明的主要原因之一,因为一旦插入运行时,它们就负责回收程序不再可访问的内存。

        9
  •  2
  •   Gerald Davis    14 年前

    内存泄漏不会持续到执行结束之后,所以任何内存泄漏的“解决方案”都是简单地结束程序执行。 显然,这更多的是关于某些类型的软件的问题。由于内存泄漏,数据库服务器需要每8小时脱机一次,这比连续播放8小时后需要重新启动的视频游戏更重要。

    术语“泄漏”是指随着时间的推移,内存消耗将增长,而不会增加任何好处。“泄漏”内存是既不被程序使用也不被操作系统(和其他程序)使用的内存。

    遗憾的是,内存泄漏在非托管代码中非常常见。我已经让firefox运行了几天,内存使用量是424MB,尽管只有4个标签打开。如果我关闭firefox并重新打开相同的标签页,那么内存使用量可能是<100MB。因此300+MB已经“泄漏”。