2012-02-26 63 views

回答

10

下面是从language reference

的对象从未明确销毁的摘录;然而,当他们无法到达时,他们可能会被垃圾收集。 允许实现推迟垃圾收集或完全忽略垃圾收集 - 只要没有收集到仍然可以访问的对象,实施质量如何实现垃圾收集就成了一个问题。

CPython的实现细节:CPython的目前使用与(可选)延迟环状连接的垃圾,其中,当他们变得不可达收集大多数物体的检测的引用计数方案,但不能保证,收集含有循环引用垃圾。有关控制循环垃圾收集的信息,请参阅gc模块的文档。其他实现的行为不同,CPython可能会改变。不要依赖对象在无法访问时立即敲定(例如:始终关闭文件)。

编辑:关于推迟垃圾回收....的gc模块可让您与垃圾回收器交互,如果你想和改变采集频率等禁用它,但我没有用它自己。此外,包含__del__方法are not collected的任何对象的循环。

+0

不错,虽然很香。任何想法如何排放或推迟gc? – 2012-02-26 00:45:40

+0

这是一个不同的问题马特阿尔科克和答案是可用的。 – erisco 2012-02-26 00:47:21

+0

@MattAlcock:发射或推迟gc? (1)这是一个单独的问题。和。 (2)你为什么想要?如果您不想收集对象垃圾,请将其分配给一个变量。 – 2012-02-26 00:59:08

11

什么时候在Python中收集对象垃圾?

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

在任何时间引用计数下降到零,对象被立即删除。

293/* Python的循环GC不应该看到的传入引用次数

294 * 0

:如果事情decref'ed为0,它应该是

295 *当时立即释放。

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

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

88充分收集如果比率

89 long_lived_pending/long_lived_total

90高于给定值(硬连线到25%)。

何时释放内存?

我只能剔除这些信息。

781/*清除所有的自由列表

782 *所有自由列表被最高 代的收集过程中被清除。

783 *在空闲列表中分配的项目可能会保留pymalloc竞技场 占用。

784 *清除空闲列表可能会提前回忆OS。

785 */

据此,Python的可能是保持你的对象空闲列表,即使你把它的引用计数为零回收。我无法明确地发现什么时候进行免费调用以将内存回馈给操作系统,但我想象这是在进行收集并且该对象未被保存在空闲列表中时完成的。

集合是否会影响性能?

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

需要实时响应的程序我遇到了问题,因为垃圾收集器不允许我控制它们何时运行或它们的运行时间。一些特殊情况也会导致内存过多使用,例如Python对于保留空闲列表的诀窍。