Python垃圾收集(Python GC)
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垃圾收集摘要
其中我们提供一些最终方法,通过这些方法可以优化垃圾回收的使用:
不要强行收集垃圾太多次。
这是因为,即使释放内存,评估对象是否符合垃圾收集条件仍然需要时间。如果要在应用程序中手动管理垃圾收集,请仅在应用程序完全启动后才开始进行此操作,然后在稳定操作中继续进行操作。