【问题标题】:When does CPython garbage collect?CPython 垃圾何时收集?
【发布时间】:2014-06-02 04:06:43
【问题描述】:

如果我的理解是正确的,在 CPython 中,对象的引用计数一达到零就会被删除。如果您有无法访问的引用循环,则该逻辑将不起作用,但有时解释器会尝试找到它们并删除它们(您可以通过调用 gc.collect() 手动执行此操作)。

我的问题是,这些解释器触发的循环收集步骤何时发生?什么样的事件会触发它们?

我对 CPython 案例更感兴趣,但很想听听这在 PyPy 或其他 python 实现中有何不同。

【问题讨论】:

标签: python garbage-collection cpython python-internals


【解决方案1】:

GC 根据自上次 GC 运行以来发生的分配和释放次数(之间的差值)定期运行。

gc.set_threshold() function

为了决定何时运行,收集器跟踪自上次收集以来的数字对象分配和释放。当分配次数减去释放次数超过threshold0时,开始收集。

您可以使用gc.get_count() 访问当前计数;这将返回 3 个计数 GC 跟踪的元组(另外 2 个用于确定何时运行更深入的扫描)。

PyPy 垃圾收集器的运行方式完全不同,因为 PyPy 中的 GC 进程负责所有释放,而不仅仅是循环引用。此外,PyPy 垃圾收集器可插入,这意味着它运行的频率取决于您选择的 GC 选项。例如,当低于内存阈值时,默认的 Minimark 策略甚至根本不会运行。

请参阅RPython toolchain Garbage Collector documentation 了解有关其策略的一些详细信息,并参阅Minimark configuration options 了解有关可以调整的更多提示。

同样适用于 Jython 或 IronPython;这些实现依赖于主机运行时(Java 和 .NET)为它们处理垃圾收集。

【讨论】:

  • 谢谢,这正是我想要的。您是否知道调整这些数字是否值得?
  • @toth:是的,如果您的应用程序频繁创建和销毁大量循环引用发生率非常低的对象,您可以显着降低阈值以减少 GC 占用不必要的 CPU 时间的机会您的应用程序的垃圾收集运行频率太高。
  • 谢谢你,很好的回答!
  • lower 我的意思是增加它们,这样它们就不会经常被触发。抱歉,这可能令人困惑。
猜你喜欢
  • 2021-03-25
  • 2016-05-19
  • 2012-06-28
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多