Python垃圾收集(Python GC)

时间:2020-02-23 14:42:44  来源:igfitidea点击:

Python垃圾回收是python中的内存管理机制。
让我们研究一下垃圾收集的不同方面以及python垃圾收集的工作方式。

什么是垃圾回收?

垃圾收集是清除共享计算机内存的过程,当该程序不再需要该内存时,该内存将由正在运行的程序使用。
通过垃圾回收,该内存块被清除,以便其他程序(或者同一程序)可以再次使用它。

垃圾回收是许多编程语言中的内存管理功能。
在本程序中,我们将研究此机制在Python中的工作方式。

Python垃圾回收

Python中的内存管理过程非常简单。
Python通过对程序中每个对象具有的引用进行计数来处理其对象,这意味着每个对象存储在程序中被引用的次数。
此计数随程序运行时更新,当计数为零时,这意味着程序不再可访问该计数。
因此,该对象的内存可以被解释器回收和释放。

让我们借助示例研究python垃圾回收:

class User(object):
  def __del__(self):
      print("No reference left for {}".format(self))

user1 = User()
user2 = user1
user3 = user1

在此示例中,我们制作了一个类和3个引用变量指向同一对象。
让我们直观地看一下:

现在,让变量user1,user2和user3指向None而不是User实例。

>>> user1 = None
>>> user2 = None
>>> user3 = None
No reference left for <__main__.User object at 0x212bee9d9>

将最后一个变量" user3"分配给"无"后,该对象将被垃圾回收,并调用__del__函数。

垃圾收集如何随实施而变化

垃圾收集是一种机制,它随诸如CPython,Jython或者IronPython之类的Python实现而变化。

  • Python的C实现使用引用计数来跟踪无法访问的对象。
    它不会在执行的每一行都跟踪对象,而是定期执行周期检测算法,以查找无法访问的对象并清除它们。

  • Jython使用JVM的垃圾收集器。
    同样适用于使用CLR垃圾收集器的IronPython

如果您想研究gc接口,请查看Python文档。

Python Force垃圾收集

如上文所述,Garbage集合会在程序执行时自动运行,有时,我们可能希望在特定时间运行Garbage集合。
我们可以通过调用collect()函数来实现。
让我们尝试定义一个LinkedList类来演示这一点:

class LinkedList(object):
  def __init__(self, name):
      self.name = name
      self.next = None
  def set_next(self, next):
      print('Linking nodes %s.next = %s' % (self, next))
      self.next = next
  def __repr__(self):
      return '%s(%s)' % (self.__class__.__name__, self.name)

完成后,我们可以开始构造它们的对象并手动触发垃圾回收:

# Constructing a circular LinkedList
a = LinkedList('1')
b = LinkedList('2')
c = LinkedList('3')
a.set_next(b)
b.set_next(c)
c.set_next(a)

# Remove references to the LinkedList nodes in this module's namespace
a = b = c = None

# Show the effect of garbage collection
for i in range(2):
  print('Collecting %d ...' % i)
  n = gc.collect()
  print('Unreachable objects:', n)
  print('Remaining Garbage:', pprint.pprint(gc.garbage))
  print

在此示例中,第一次运行Garbrge收集时,便会清除循环LinkedList对象。

Python垃圾收集摘要

其中我们提供一些最终方法,通过这些方法可以优化垃圾回收的使用:

  • 不要强行收集垃圾太多次。
    这是因为,即使释放内存,评估对象是否符合垃圾收集条件仍然需要时间。

  • 如果要在应用程序中手动管理垃圾收集,请仅在应用程序完全启动后才开始进行此操作,然后在稳定操作中继续进行操作。