python - python中的垃圾收集和引用计数

标签 python garbage-collection

我正在尝试调试为什么我的一个对象没有被垃圾回收,我在尝试查看文档/之前的问题时遇到了几个问题:

1) 如果我的对象不涉及任何引用循环,我认为垃圾收集不涉及,Python 只是在对象的引用计数下降到 0 时释放内存,这对吗?

2)当这样一个简单的对象的引用计数为0时,是否立即释放内存,如果没有,有没有办法强制释放?

3) Python 是否使用 sys.getrefcount(obj) 来跟踪引用计数?

4) 为什么下面的代码片段没有将引荐来源网址的数量从 1 增加到 2(两次都打印 1)?

import gc
a = []
print(len(gc.get_referrers(a))
b = a
print(len(gc.get_referrers(a))

最佳答案

1) 是的,你是对的。如果您确定您的代码不包含引用循环,您甚至可以禁用 GC:https://docs.python.org/2/library/gc.html

Since the collector supplements the reference counting already used in Python, you can disable the collector if you are sure your program does not create reference cycles. Automatic collection can be disabled by calling gc.disable().

2) 如果你想强制收集阶段,你可以简单地调用 collect

3) sys.getrefcount (obj) 包含对函数参数的引用,不确定它是否回答了你的问题

4) get_referrers 的返回不是一个简单的列表,它是一个包含对您的对象的引用的字典的列表。 尝试打印完整的返回,你会得到类似的东西:

[{'a': [], 'b': [], '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'yourfile.py', '__package__': None, 'gc': <module 'gc' (built-in)>, 'x': {...}, '__name__': '__main__', '__doc__': None}]

您可以将所有对对象的引用视为字典中的元素。

关于python - python中的垃圾收集和引用计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33527124/

相关文章:

python - tf.image.resize_bilinear() - 当 align_corners=False 时

java - 如何从 JVM 中检测到长时间的 gc?

java - 循环 GC 在映射中起作用吗?

python - opencv:将像素写入图像

python - paramiko 导入错误 : DLL load failed: The operating system cannot run %1

python - 如何在 Python 3 中扩展 datetime.date?

c# - .net 标准库在 .net 核心中失败,但在框架中失败

python - TypeError : range() integer end argument expected, 在 Python 中得到 str

ruby - ruby 中的垃圾收集循环列表

objective-c - 在 MonoTouch 中释放/处理 UIViewController