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

时间:2010-11-10 22:19:05

标签: memory-leaks operating-system

当我们说程序泄漏内存时,在c ++中没有删除的情况下说,它真的泄漏吗?我的意思是,当程序结束时,是否仍然将内存分配给某些非运行程序并且无法使用,或者操作系统是否知道每个程序请求的内存,并在程序结束时释放它?如果我多次运行该程序,我会耗尽内存吗?

9 个答案:

答案 0 :(得分:36)

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

答案 1 :(得分:19)

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

如果您经常运行任何程序而不在其间关闭它(同时运行越来越多的实例),那么无论是否存在内存泄漏,您最终都会耗尽内存,所以这也是真的有内存泄漏的程序。显然,泄漏内存的程序将比没有内存泄漏的相同程序更快地填充内存,但是在没有填充内存的情况下运行它的次数更多地取决于程序需要正常操作所需的内存量,而不是内存泄漏或不。除非你要比较两个完全相同的程序,一个是内存泄漏而另一个是没有内存,所以这种比较真的没什么价值。

当程序运行很长时间时,内存泄漏变得最严重。典型的例子是服务器软件,例如Web服务器。例如,对于游戏或电子表格程序或文字处理程序,内存泄漏并不是那么严重,因为最终会关闭这些程序,从而释放内存。但当然,记忆泄漏是令人讨厌的小动物,应该始终作为原则解决。

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

答案 2 :(得分:14)

执行停止后OS会返回泄漏的内存。

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

让我们看一下以下场景:

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

    但是如果内存是在一个循环中分配的并且忘记了删除,那么你会遇到真正的问题:

    1. 程序A从操作系统中询问内存
    2. 操作系统将块X标记为A已使用并将其返回给程序。
    3. 程序应该有一个指向X的指示。
    4. 转到1
    5. 如果操作系统内存不足,程序可能会崩溃。

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

答案 5 :(得分:3)

在代码本身没有更多抓住内存的意义上,它更加泄漏。

答案 6 :(得分:2)

操作系统可以在程序结束时释放内存。如果程序中存在泄漏,那么在程序运行时这只是一个问题。这对于诸如服务器进程之类的长时间运行的程序来说是个问或者,例如,如果您的Web浏览器出现内存泄漏并且您将其保持运行数天,则会逐渐消耗更多内存。

答案 7 :(得分:2)

据我所知,在大多数操作系统启动程序时,它会收到一段已定义的内存,一旦程序结束,它将完全解放。

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

答案 8 :(得分:1)

内存泄漏不会在执行结束后持续存在,因此任何内存泄漏的“解决方案”都只是结束程序执行。显然,这对某些类型的软件来说更是个问题。由于内存泄漏,每8小时需要脱机的数据库服务器比连续播放8小时后需要重新启动的视频游戏更具问题。

术语“泄漏”指的是随着时间的推移,内存消耗将增长而没有任何增加的益处。 “泄漏”存储器是程序既不使用也不由OS(和其他程序)使用的存储器。

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