什么时候在python中收集垃圾?

Mat*_*ock 16 python garbage-collection memory-management

什么时候在python中收集垃圾?什么时候发布内存并且收集会影响性能?可以选择退出或调整gc算法,如果是,如何?

Pra*_*ota 12

以下是语言参考的摘录

对象永远不会被明确销毁; 然而,当它们变得无法到达时,它们可能被垃圾收集.允许实现推迟垃圾收集或完全省略垃圾收集 - 只要没有收集到仍然可以访问的对象,实现垃圾收集的实现方式就是如此.

CPython实现细节:CPython目前使用引用计数方案和(可选)延迟检测循环链接垃圾,一旦它们变得无法访问就收集大多数对象,但不保证收集包含循环引用的垃圾.有关控制循环垃圾收集的信息,请参阅gc模块的文档.其他实现的行为不同,CPython可能会改变.当对象无法访问时,不要依赖于对象的立即终结(例如:始终关闭文件).

编辑:关于推迟垃圾收集.... gc模块允许您与垃圾收集器交互,并禁用它,如果你想和更改收集频率等.但我自己没有使用它.此外,不会收集包含具有__del__方法的任何对象的循环.

  • @MattAlcock:高性能系统通常不使用任何类型的 **any** 动态内存分配。当我制作雷达和声纳时,数据结构是严格静态分配的。在高性能系统中使用任何动态内存分配的想法似乎是矛盾的。在 Python 中关闭垃圾收集传统上是通过用 C 编写性能关键代码并从 Python 调用来完成的。 (2认同)

eri*_*sco 12

什么时候在python中收集垃圾?

目前在CPython的源代码中的很多细节:http://svn.python.org/view/python/trunk/Modules/gcmodule.c?revision=81029&view=markup

只要引用计数降为零,就会立即删除该对象.

293/*Python的循环gc永远不会看到传入的引用计数

294*0:如果某事减少到0,那应该是

295*当时立即解除分配.

当新对象的数量大于现有对象数量的25%时,将触发完整集合.

87除了各种可配置的阈值之外,我们只触发a

如果比例为88全面收集

89 long_lived_pending/long_lived_total

90高于给定值(硬连线至25%).

什么时候释放内存?

我只能钓掉这些信息.

781/*清除所有免费清单

782*所有免费清单在最高代收集期间被清除.

783*免费列表中的已分配项目可能会占用pymalloc竞技场.

784*清除空闲列表可能会提前向操作系统返回内存.

785*/

据此,Python可能会将您的对象保留在一个空闲列表中以便进行回收,即使您将其引用计数降为零也是如此.我无法明确地找到何时进行免费调用以将内存返回给操作系统,但我想这是在收集完成并且对象未保存在空闲列表中时完成的.

该系列是否会影响性能?

我听说过的任何非平凡的垃圾收集器都需要CPU和内存才能运行.因此,是的,总会对性能产生影响.你必须试验并了解你的垃圾收集器.

需要实时响应的程序我遇到了问题,因为垃圾收集器不允许我控制它们运行的​​时间或它们的运行时间.一些特殊情况也可能导致过多的内存使用,例如Python保持免费列表的诀窍.