微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

什么时候操作系统擦除一个进程的内存?

进程在某个OS上成功或exception终止,OS何时决定清除分配给该进程的内存(数据,代码等) 在退出或当它想要分配内存到一个新的进程?

而这是在所有的操作系​​统(winXP,Win7,linux,Mac)上擦除内存分配过程一样吗?

据我所知,页表有映射该进程的虚拟地址和内存中的实际物理地址。

谢谢。

Elasticsearch内存问题

valgrind错误:条件跳转或移动取决于未初始化的值(s)

Linux:由于虚拟内存限制,不能在单个进程中分配超过32 GB / 64 GB的内存

在Windows上的 Device PhysicalMemory上需要说明

Linux:如何获得进程使用的交换?

在Windows初始化静态全局variables时,新返回NULL?

查找Windows应用程序的真实内存占用情况

JVM内存和cpu使用的实际限制?

PHPfile upload – CGI上的内存处理

/ proc / meminfo中的条目

操作系统回收流程资源的方式(通常会)因操作系统而异。 在Windows的方面,NT衍生的操作系统的行为是相似的,所以win XP和win7应该没什么区别。 请注意,在这种情况下询问“内存”是过分简化的,因为存在不同类型的内存。 例如,一个典型的Windows应用程序将有堆栈内存,堆内存(有时多堆),指令/静态内存,也许共享内存。 这些内存中的大部分是由进程独占的,Windows将在进程终止时收回(甚至是异常终止)。

然而,共享内存可以(并且经常)具有多个所有者; 它绑定到一个Windows句柄 (一个内核级别的对象,可能被多个进程引用)。 手柄有一个引用计数,如果引用计数为零,相关资源将被回收。 这意味着共享内存可以超过引用它的进程。 另外,一个进程可能会“泄漏”一个句柄,而句柄也不会被回收。 程序员有责任确保这些手柄正确关闭并不泄漏; 异常终止的可能性使这个责任变得复杂。

一个侧面说明,当Windows“回收”内存时,它只是意味着内存可用于未来分配给其他进程等。实际的1和0通常会坐在那里,直到操作系统分配内存和新的拥有者的内存主动覆盖它。 因此,“回收”并不意味着记忆立即清零或类似的东西; 在这个问题上清理内存是低效的,而且往往是不必要的。 如果您要求出于安全考虑,则不应该依赖于操作系统; 在进程释放回操作系统之前,您需要自行清理内存。

如果您想了解更多关于现代Windows操作系统如何处理内存的知识,并且不介意进行一些挖掘操作,MSDN上的Windows api文档有很多关于这个主题的信息,但是它有点分散。 好的地方,可能会启动Windows Handles,并加载/卸载库/进程调用。 应用程序编程Windows(里希特)可能有这方面的一些体面的信息,如果我没有记错,但我现在没有副本现在检查。

希望有更多关于Linux内部知识的人可以解决这个问题。 这是操作系统特定的东西,所以可能会有差异。 可能值得注意的是,NT之前的Windows(例如Windows 95,98等)具有完全不同的进程内存模型。 这些差异使得操作系统在异常终止的情况下难以回收内存; 一些用户发现,如果运行不稳定的应用程序,需要频繁地重新启动操作系统,以清理累积的内存泄漏。

在Linux中,通常在进程结束时释放资源。 您可以阅读有关Linux如何处理进程终止的信息: http : //www.informit.com/articles/article.aspx? p=370047& seqNum=4

在嵌入式Android世界中我也知道,在极低的内存情况下也可以踢入OOM杀手,但是我并没有真正把它留在LWN.net的顶部。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐