我有一个桌面程序。大多数操作系统在自己的地址空间中运行程序。
当程序退出时,我相信大多数操作系统释放程序分配的内存并将其返回到内存堆栈以供重用。
我不确定的是,如果程序存在内存泄漏,内存“泄漏”是否也会被返回以供重用,或者在重新启动计算机之前它是否会丢失?
这是我今天早些时候提出的问题的后续问题:Do Small Memory Leaks Matter Anymore?,并且有一些评论提到程序内存在程序完成时被释放。如果在程序完成后释放泄漏,那么它肯定会给我带来更少的压力,使我的计划彻底摆脱最微小的泄漏。
具体来说,我是一名Windows程序员,我需要知道Windows 98,2000,XP,Vista和7会发生什么(内存丢失或内存释放)。但我也想知道Mac上会发生什么Unix机器。
我确实意识到程序中不断增长的泄漏是严重的,必须修复。
无论哪种方式,问题都不在于是否必须修复泄漏。当程序结束时,操作系统是否会返回泄漏的内存。
答案 0 :(得分:6)
内存泄漏只是指程序分配内存然后失去跟踪的内存。操作系统仍将该内存视为程序的地址空间,因此在程序完成时将重用该内存。
所有现代操作系统都使用称为虚拟内存的机制来跟踪程序内存。
这是我非常详细了解虚拟内存的地方CS3231。
基本上,操作系统可以将应用程序内存块放在物理内存中的任何位置,同时保持映射到这些块应指向的位置。
从应用程序的角度来看,它可以完全访问内存(32位操作系统上的4gig,64位上的大量内存),并且可以保持分配直到达到硬件限制,即使物理内存小于此限制(这要求操作系统将一些内存内容存储在磁盘上,通常在交换文件中)
这可以通过CPU上的硬件来实现,这个模块通常称为MMU(内存管理单元),有时还有一个TLB(Translation Lookaside Buffer)来加速虚拟内存操作。
另一个page解释了更多关于内存保护的内容,详细介绍了虚拟内存的一些内部工作原理。
答案 1 :(得分:2)
Windows将在终止后释放您的进程内存 但泄漏会对您的应用程序性能和可靠性产生一些影响(取决于其大小)
在某些方面,小泄漏比大泄漏更糟糕,因为它们会导致软件中的爬行降级,直到不可避免的死亡,可能需要花费数小时用户的工作。
如果您确实知道内存泄漏,我建议您将它们捕获并删除它们,操作系统的任何部分或您的编程语言都不会有效地为您执行此操作。 有一些非常好的工具可以确定泄漏点。
答案 2 :(得分:2)
作为我所在领域的专业人士,我发现有人不关心他们是否正在做好自己的工作而感到厌恶。你应该努力做好自己的工作,这将转化为你写出更好的课程。允许或忽略内存泄漏为“不重要”意味着您更有可能对您认为“不重要”的其他内容(如文档,性能或用户友好性)执行相同的操作。
自由放任的态度会产生问题。所以我认为记忆漏洞是你工作能力差的一个标志。
然而,说了这么多,有非常真实的理由不忽视内存泄漏。例如,您不知道用户运行程序的时间。可能是5分钟或5周。内存泄漏积聚,并使用越来越多的资源,直到其他事情开始失败。
要记住的另一个问题是用户不仅要运行您的程序。他们也运行其他应用程序,您的应用程序使用的资源越多,其他程序可用的资源就越少。忽略内存泄漏基本上是自私的,如果用户遇到问题则不关心。