【问题标题】:Manual garbage collection in PythonPython中的手动垃圾收集
【发布时间】:2009-10-29 05:06:02
【问题描述】:

有没有什么方法可以手动删除垃圾收集器拒绝删除的对象,即使我调用gc.collect()?在 Python 3.0 中工作

【问题讨论】:

  • 不了解 Python,但一些垃圾收集器有时会错误地认为某些东西仍在使用中,因为他们发现 看似 是对这些对象的引用(但实际上并非如此) t)。在这种情况下,您无能为力。
  • 另外,您应该尽快迁移到 Python 3.1。 3.0 存在许多已知问题,不再受支持。
  • 一旦我完成荣誉,我打算。

标签: python garbage-collection


【解决方案1】:

根据the docsgc.get_referrers(thatobject) 会告诉您为什么该对象仍然存在(在gc.collect() 之后立即执行以确保不希望的“活跃性”将持续存在)。在那之后,它在某种程度上是一种黑色艺术;-)。您经常会发现一些引荐来源是列表(那么为什么该列表引用thatobject?您可以在紧急模式下.remove 它,但让正常代码听起来更好......),并且,更常见的是,dicts(其中许多可能是某个类实例或其他实例的__dict__s——通常很难找出哪个类实例……再次,蛮力删除有时是一种权宜的紧急解决方案,但绝不是一个可持续的长距离的!-)。

【讨论】:

    【解决方案2】:

    如果 GC 拒绝销毁它,那是因为您在某处引用了它。摆脱引用,它将(最终)消失。例如:

    myRef = None
    

    请记住,除非需要,否则 GC 可能不会必然销毁您的对象。

    如果您的对象持有不在 Python 管理下的资源(例如,从 Python 调用的 C 代码的一些技巧),则该对象应提供资源释放调用,以便您可以在需要时执行此操作,而不是在 Python 决定时执行此操作。

    【讨论】:

      【解决方案3】:

      delNone 是你的唯一朋友

      >>> a = "Hello"
      >>> a = None
      Or
      >>> del a
      

      【讨论】:

      • 不一定正确。该对象只需要不可访问(或具有令人满意的一次性引用计数,非常希望与前者一致)才有资格进行回收。
      • del a 不会删除对象(只是一个注释;并不暗示您暗示)
      【解决方案4】:

      这取决于您的 Python 运行在什么之上。 Here's good article 说明详情

      引用:

      在当前版本的 CPython 中,循环内对 x 的每个新分配都会释放先前分配的资源。使用 GC,这是无法保证的。如果您想编写适用于任何 Python 实现的代码,则应显式关闭资源;无论GC如何,这都会起作用:

      for name in big_list:
          x = Resource()
          do something with x
          x.close()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-12
        • 1970-01-01
        • 1970-01-01
        • 2016-02-07
        • 2018-04-08
        • 1970-01-01
        • 2013-04-25
        • 2016-02-14
        相关资源
        最近更新 更多