CPython退出时为什么不释放所有内存?

时间:2018-04-12 20:29:06

标签: python python-3.x memory-management documentation

我想清楚,我没有看到这个问题所描述的行为。而我的问题与问题本身有关:

python 3 official FAQ这个逐字说:

  

为什么CPython退出时不释放所有内存?

并提供了这个答案:

  

从Python模块的全局命名空间引用的对象是   Python退出时并不总是解除分配。如果有,可能会发生这种情况   循环引用。还有一些内存   由C库分配的,不可能免费的(例如工具   像Purify会抱怨这些)。然而,Python是积极的   关于在退出时清理内存并尝试销毁每一个   对象

     

如果要强制Python删除释放时的某些内容   使用atexit模块运行一个强制执行这些功能的函数   缺失。

这假设一个托管内存操作系统(Linux,Mac,Windows,GNU,BSD,Solaris ......),听起来完全是胡说八道。

在退出的程序(无论是Python还是其他任何东西)上,它从OS请求的任何内存都被释放(因为操作系统可以控制虚拟页面表等等)。该程序不必解除分配或解构任何东西(程序曾经必须做的事情,正如有人使用cp得到bottlenecked by a hash table deconstruction时强调的那样),但我不这样做认为任何操作系统的Python 3支持都会对程序提出这个要求。

这在某些我不知道的情况下是否有意义?这是指什么?

3 个答案:

答案 0 :(得分:3)

常见问题解答只是说cpython本身并没有主动释放它终止时获得的所有内存

如果在任何正常的服务器/桌面操作系统上运行cpython,它会在进程退出时释放进程的所有内存,那么内存泄漏就没有问题。操作系统负责在进程退出时释放所有内存。

常见问题解答更多的是告诉您cpython在使用malloc()或类似内容分配的所有内存上都不调用free()或类似内容。如果在操作系统上运行cpython时,如果在进程退出时不释放进程获取的所有内存(这些操作系统存在,特别是许多嵌入式内核的情况),则可能会产生这种后果。如果你在内存分析器/泄漏检测器下运行cpython,该检测器可能会报告内存不是空闲的()' d泄漏。

答案 1 :(得分:0)

有两种情况可以理解。

首先,在Python上运行内存泄漏分析器会报告在Python退出时没有明确释放的内存,因为它表明存在泄漏,即使它全部被操作系统清除。

其次,Python被设计为嵌入到其他程序中,在这种情况下,Python可能会被关闭(甚至重新启动)而整个过程不会结束。在整个过程结束之前,操作系统不会清理Python的内存。请参阅tutorial以在其他应用程序中嵌入Python,以及Python C API docs

答案 2 :(得分:0)

我认为常见问题解答中的问题略有歧义。一旦Python进程退出,内存就会被操作系统释放,并且可以被提供给其他进程。正如你正确指出的那样,没有办法将内存分配(或不是免费)给不存在的进程。

我认为FAQ所指的是,在关闭python进程时,有可能最终处于仍然分配给进程的内存无法正常垃圾收集和释放的状态。如果您有循环引用等,可能会发生这种情况(如FAQ所述)。