【问题标题】:When garbage collection occurs?垃圾收集何时发生?
【发布时间】:2012-12-28 10:31:41
【问题描述】:
>>>a=6
>>>b=5
>>>c=4
>>>d=c
>>>print(d)
>>>del b
>>># a and b "must be" garbage collection or "maybe" garbage collection

a 和 b 可能是垃圾收集或 a 和 b 必须是垃圾收集? 如何证明?

【问题讨论】:

  • 老实说,我不知道你在问什么。您介意为您的问题添加一些背景信息并使问题本身更加清晰吗?最好使用 full 句子,带有动词 e.t.c.?

标签: python python-3.x python-2.7


【解决方案1】:

CPython 使用reference counting。 Jython 和 IronPython 使用其底层 VM 的 GC。话虽如此,CPython 实习小整数,包括那些在你的代码中使用的,因此那些特别是永远不会被 GCed。

【讨论】:

    【解决方案2】:

    Python 变量只是引用对象的名称。在您的示例中,您有三个对象,整数 4、5 和 6。

    整数 6 被 a 引用,5 最初被 b 引用,4 被 c 和 d 引用。然后你打电话给del(b)。这从整数 5 中删除了引用。所以此时,6 和 4 仍然被引用,而 5 则没有。

    究竟如何处理垃圾收集是一个实现细节。

    现在看here:

    当前的实现为 -5 到 256 之间的所有整数保留一个整数对象数组,当您在该范围内创建一个 int 时,实际上您只是返回对现有对象的引用

    因此,您在此示例中使用的数字永远不会被垃圾回收。

    关于何时收集垃圾在gc.set_threshold(threshold0, threshold1, threshold2)的文档中有描述:

    为了决定何时运行,收集器会跟踪自上次收集以来的数字对象分配和释放。当分配数减去解除分配数超过阈值0时,开始收集。最初只检查第 0 代。如果自检查第 1 代以来检查第 0 代的次数超过阈值 1 次,则也检查第 1 代。同样,threshold2 控制在收集第 2 代之前收集第 1 代的数量。

    阈值的标准值是;

    In [2]: gc.get_threshold()
    Out[2]: (700, 10, 10)
    

    【讨论】:

      【解决方案3】:

      垃圾收集的工作方式是一个实现细节。另请参阅 Python 常见问题解答中的问题“My class defines __del__ but it is not called when I delete the object”。

      在 CPython 中,引用计数是默认的,这意味着对象将在最后一个引用被删除的那一刻被删除。所以如果你有一个名为a的对象,它只在当前作用域中被引用,del a会完全删除它。

      但是,CPython 还维护一个循环对象列表,以处理 reference counting fails 的特殊情况。您无法判断最终出现在此列表中的对象何时会被删除,但最终它们会被删除。

      在其他 Python 实现中,all 对象可能有一个完整的垃圾收集器,因此您永远不应依赖 del a 实际删除对象。这也是为什么您应该始终使用.close() 手动关闭文件描述符以防止资源泄漏,直到程序关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-02
        • 1970-01-01
        • 2015-04-12
        • 2012-06-28
        • 2016-04-03
        • 1970-01-01
        • 2011-03-14
        • 2011-01-21
        相关资源
        最近更新 更多