gpt4 book ai didi

python - 垃圾收集器是否跟踪所有 Python 对象?

转载 作者:太空宇宙 更新时间:2023-11-03 12:51:48 26 4
gpt4 key购买 nike

我正在尝试调试内存泄漏(参见问题 Memory leak in Python Twisted: where is it?)。

当垃圾收集器运行时,它是否可以访问 Python 解释器创建的所有 Python 对象?如果我们假设 Python C 库没有泄漏,RSS 内存使用量是否应该相对于 GC 对象计数线性增长? sys.getobjects 呢?

最佳答案

CPython 使用两种机制来清理垃圾。一种是引用计数,它影响所有对象,但不能清除(直接或间接)相互引用的对象。这就是真正的垃圾收集器发挥作用的地方:python 有 gc 模块,它在它知道的对象中搜索循环引用。只有可能成为引用循环一部分的对象才需要担心参与循环 gc。因此,例如,列表可以,但字符串不可以;字符串不引用任何其他对象。 (事实上​​,这个故事有点复杂,因为有两种参与循环 gc 的方式,但这与这里无关。)

循环 gc 会自动跟踪所有 Python 类(及其实例)。 C 中定义的类型不是,除非他们付出一点努力。所有可以成为循环一部分的内置类型都可以。但这确实意味着 gc 模块只知道一起玩的类型。

除了收集机制之外,还有一个事实是 Python 有自己的聚合内存分配器 (obmalloc),它分配整个内存区域并将内存用于它创建的大多数较小对象。 Python 现在会在这些竞技场完全清空时释放这些竞技场(很长一段时间都没有),但实际上清空竞技场是相当罕见的:因为 CPython 对象不可移动,你不能只是将一些落后者移动到另一个竞技场。

关于python - 垃圾收集器是否跟踪所有 Python 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4079171/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com