![]() |
1
20
在具有受保护内存的操作系统(Mac OS 10+、所有Unix克隆(如Linux)和基于NT的Windows系统(即Windows 2000及更低版本)上,当程序结束时,内存将被释放。 如果你经常运行任何一个程序而不在两者之间关闭它(同时运行越来越多的实例),不管是否存在内存泄漏,你最终都会耗尽内存,所以内存泄漏的程序也是如此。显然,泄漏内存的程序将比没有内存泄漏的相同程序更快地填满内存,但您可以在不填满内存的情况下运行它多少次,在很大程度上取决于程序正常运行所需的内存量,而不是是否存在内存泄漏。除非你在比较两个完全相同的程序,一个有内存泄漏,另一个没有内存泄漏,否则这种比较是毫无价值的。 当程序运行很长时间时,内存泄漏会变得最严重。典型的例子是服务器软件,比如web服务器。例如,对于游戏、电子表格程序或文字处理程序,内存泄漏并没有那么严重,因为你最终会关闭这些程序,释放内存。但当然,内存泄漏是一种令人讨厌的小动物,应该始终作为一个原则问题加以解决。 但如前所述,当程序关闭时,所有现代操作系统都会释放内存,因此即使出现内存泄漏,如果继续打开和关闭程序,也不会填满内存。 |
![]() |
2
37
不,在所有实际操作系统中,当程序退出时,所有的资源都由OS回收。内存泄漏在可能持续运行较长时间的程序和/或可能经常从同一程序调用的函数中变得更为严重。 |
![]() |
3
15
执行停止后,操作系统将返回泄漏的内存。 这就是为什么它并不总是桌面应用程序的大问题,而是服务器和服务的大问题(它们往往运行很长时间)。 让我们看看下面的场景:
没什么问题。 但是,如果在循环中分配内存而忘记删除,则会遇到真正的问题:
如果操作系统内存不足,程序可能会崩溃。 |
![]() |
4
6
不,一旦操作系统关闭程序,内存就会恢复(给一个相当现代的操作系统)。问题在于长时间运行的进程。 |
![]() |
5
4
当进程结束时,内存也会被清除。问题是,如果一个程序泄漏内存,它将要求越来越多的操作系统运行,并可能导致操作系统崩溃。 |
![]() |
6
4
从代码本身不再控制内存这一点来说,它更容易泄漏。 |
![]() |
7
3
操作系统可以在程序结束时释放内存。如果程序中存在漏洞,那么程序运行时只是一个问题。对于长时间运行的程序(如服务器进程),这是一个问题。或者,如果你的web浏览器有内存泄漏,并且你让它运行了几天,那么它将逐渐消耗更多的内存。 |
![]() |
8
3
据我所知,在大多数操作系统上,当一个程序启动时,它接收到一段定义好的内存,一旦程序结束,内存将被完全释放。 内存泄漏是垃圾收集器算法发明的主要原因之一,因为一旦插入运行时,它们就负责回收程序不再可访问的内存。 |
![]() |
9
2
内存泄漏不会持续到执行结束之后,所以任何内存泄漏的“解决方案”都是简单地结束程序执行。 显然,这更多的是关于某些类型的软件的问题。由于内存泄漏,数据库服务器需要每8小时脱机一次,这比连续播放8小时后需要重新启动的视频游戏更重要。 术语“泄漏”是指随着时间的推移,内存消耗将增长,而不会增加任何好处。“泄漏”内存是既不被程序使用也不被操作系统(和其他程序)使用的内存。 遗憾的是,内存泄漏在非托管代码中非常常见。我已经让firefox运行了几天,内存使用量是424MB,尽管只有4个标签打开。如果我关闭firefox并重新打开相同的标签页,那么内存使用量可能是<100MB。因此300+MB已经“泄漏”。 |
![]() |
user3732361 · 读取大文件时如何选择块大小? 7 年前 |
![]() |
Sector · 将参数传递给自己的execv内核实现 7 年前 |
![]() |
Arka Pal · 关闭管道中未使用的端部 7 年前 |
![]() |
Nat · 释放malloc内存时程序停止工作 7 年前 |
![]() |
Mengfan Ma · 作者所说的操作系统中的目录结构是什么意思? 7 年前 |
![]() |
Mengfan Ma · 在何处执行磁盘调度 7 年前 |