首页 文章

什么操作系统将释放内存泄漏?

提问于
浏览
4

我有一个桌面程序 . 大多数操作系统在自己的地址空间中运行程序 .

当程序退出时,我相信大多数操作系统释放程序分配的内存并将其返回到内存堆栈以供重用 .

我不确定的是,如果程序有内存泄漏,内存“泄漏”是否也会被返回以供重用,或者在重新启动机器之前丢失?

这是我今天早些时候提出的问题的后续问题:Do Small Memory Leaks Matter Anymore?,并且有一些评论提到程序完成时程序存储器被释放 . 如果在程序完成后释放泄漏,那么它肯定会减轻我的压力,以便严格地消除我的程序中最微小的泄漏 .

具体来说,我是一名Windows程序员,我需要知道Windows 98,2000,XP,Vista和7会发生什么(内存丢失或内存释放) . 但我也想知道Mac和Unix机器上会发生什么 .


澄清:我说的是不增长的泄漏 . 这些是在程序运行时发生的一次大小的泄漏 .

我确实意识到程序中不断增长的泄漏是严重的,必须加以修复 .

无论哪种方式,问题不在于是否必须修复泄漏 . 当程序结束时,操作系统是否会返回泄漏的内存 .

3 回答

  • 6

    内存泄漏只是指您的程序分配内存然后失去跟踪的时间 . 操作系统仍然认为该存储器位于程序的地址空间中,因此在程序完成时将重用该存储器 .

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

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

    基本上,它是操作系统可以将应用程序内存块放在物理内存中的任何位置的地方,同时保持映射到这些块应指向的位置 .

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

    CPU上的硬件,通常称为MMU(内存管理单元)的模块便于实现,有时还有TLB(Translation Lookaside Buffer)来加速虚拟内存操作 .

    另一个page解释了更多关于内存保护的内容,其中详细介绍了虚拟内存的一些内部工作原理 .

  • 2

    Windows将在终止后释放您的进程内存,但泄漏会对您的应用程序性能和可靠性产生一些影响(取决于其大小)

    在某些方面,小泄漏比大泄漏更糟,因为它们会导致软件中的爬行降级,直到不可避免的死亡,可能需要花费数小时用户的工作 .

    如果您确实知道内存泄漏,我建议您将它们捕获并删除它们,操作系统的任何部分或您的编程语言都不会有效地为您执行此操作 . 有一些非常好的工具可以确定泄漏点 .

  • 2

    作为我所在领域的专业人士,我发现有人不关心,如果他们的工作做得好而令人厌恶 . 你应该努力做好自己的工作,这将转化为你写出更好的课程 . 允许或忽略内存泄漏为“不重要”意味着您更有可能对您认为“不重要”的其他内容(如文档,性能或用户友好性)执行相同操作 .

    自由放任的态度会产生问题 . 因此,我认为记忆泄漏是你工作能力差的一个标志 .

    然而,说了这么多,有非常真实的理由不忽略内存泄漏 . 例如,您不知道用户运行程序的时间 . 可能是5分钟或5周 . 内存泄漏积聚,并使用越来越多的资源,直到其他事情开始失败 .

    要记住的另一个问题是用户不仅运行您的程序 . 他们也运行其他应用程序,您的应用程序使用的资源越多,其他程序可用的资源就越少 . 忽略内存泄漏基本上是自私的,如果用户遇到问题则不关心 .

相关问题