Python是面向对象、高级编程语言,其世界里万物皆对象,当我们编写的程序运行时,代码中定义的对象在物理内存中会占用相应的空间。现在流行的高级语言如Java,C#等都采用了垃圾收集机制自动管理内存使用,而不像C,C++需要用户自己分配、释放内存。自己管理内存的优点是自由灵活,可以任意申请内存,但存在致命的缺点是可能会造成内存泄露。
Python解释器内核采用内存池方式管理物理内存,当创建新对象时,解释器在预先申请的物理内存块上分配相应的空间给对象使用,这样可以避免频繁的分配和释放物理内存。那么这些内存在什么时候释放呢?这涉及到Python对象的引用计数和垃圾回收。
1. 相关概念
1.1 什么是垃圾
先看一个例子。
# -*- coding: utf8 -*-
class A(object):
def __init__(self):
self.data = [x for x in range(10000)]
self.child = None
def ref():
a1 = A()
a2 = A()
a1.child = a2
在上述代码中,定义了类A,以及ref函数。在ref函数中,申明了A的两个实例对象,并且变量a1、a2分别指向这两个对象,且a1引用了a2指向的对象。当ref函数结束后,也就是a1和a2离开了作用域,在python解释器内部无任何地方引用这两个对象,因此a1、a2指向的两个对象变成“垃圾”对象。这些对象也就是所谓的内存垃圾,python解释器有一套垃圾回收机制,确保内存中无用对象及其空间及时被清理。
1.2 什么是垃圾回收
Python垃圾回收是指内存不再使用时的释放和回收过程。Python通过两种机制实现垃圾回收:引用计数、能解决循环引用问题的垃圾收集器。
garbage collection
The process of freeing memory when it is not used anymore. Python performs garbage collection via reference counting and a cyclic garbage collector that is able to detect and break reference