memory-management - 哪些操作系统将释放内存泄漏?

标签 memory-management memory-leaks operating-system

我有一个桌面程序。大多数操作系统在其自己的地址空间中运行程序。
当程序退出时,我相信大多数操作系统都会释放程序分配的内存,并将其返回到内存堆栈以供重用。
我不确定的是,如果程序发生内存泄漏,“泄漏”的内存是否也会被退回以供重用,还是在机器重新启动之前丢失?
这是我今天早些时候提出的问题的后续:Do Small Memory Leaks Matter Anymore? ,并且那里的一些评论提到程序完成时程序内存被释放。如果在程序完成时释放了泄漏,那么严格消除我的程序中最微小的泄漏肯定会给我带来更少的压力。
具体来说,我是一名 Windows 程序员,我需要知道 Windows 98、2000、XP、Vista 和 7 会发生什么(内存丢失或内存释放)。但我也想听听 Mac 和 Unix 机器上会发生什么。

澄清:我说的是非增长泄漏。这些是在程序运行时发生一次的恒定大小的泄漏。
我确实意识到程序中不断增长的泄漏是严重的,必须加以修复。
无论哪种方式,问题都不在于是否必须修复泄漏。这是程序结束时操作系统是否将泄漏的内存归还给您。

最佳答案

内存泄漏只是指您的程序在分配内存时丢失了跟踪。操作系统仍然认为这 block 内存在程序的地址空间中,因此当程序结束时它会被重用。

所有现代操作系统都使用一种称为虚拟内存的机制来跟踪程序内存。

这是我非常详细地了解虚拟内存的地方CS3231 .

基本上它是操作系统可以将应用程序内存块放置在物理内存中的任何位置,同时维护到这些 block 应该指向的位置的映射。

从应用程序的角度来看,它可以完全访问内存(在 32 位操作系统上是 4gig,在 64 位上是巨大的),并且可以继续分配直到达到硬件限制,即使物理内存小于这个限制(这需要操作系统将一些内存内容存储在磁盘上,通常在交换文件中)

这得益于 CPU 上的硬件,一个通常称为 MMU(内存管理单元)的模块,有时还有一个 TLB(Translation Lookaside Buffer)来加速虚拟内存操作。

另一个page这解释了有关内存保护的更多信息,其中详细介绍了虚拟内存的更多内部工作原理。

关于memory-management - 哪些操作系统将释放内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1720014/

相关文章:

c - 常量、文字和全局变量从哪里获得空间

java - 如何在 java 中打开 .txt 的应用程序(无论操作系统如何)?

memory-management - 适用于无需动态内存分配的开发的语言

flash - AS3 将函数作为参数传递会造成内存泄漏

c++ - 由于内存不足导致linux应用程序崩溃

performance - Haskell 是否适合长时间运行的应用程序?

c++ - 命名管道在 Windows 中如何工作?

xcode - 如何在 Mac OS X Mavericks 上安装 Xcode 4

ios - 分配时的内存泄漏

c - 在c中动态分配动态分配的字符串数组