将压缩文件减压,可以看到有很多文件,主要关心两个(Include、Objects)在Include目录下object.h中可以查看创建对象的结构体。
在创建对象时,每个对象至少内部4个值,PyObject结构体(上一个对象、下一个对象、类型、引用个数)。
有多个元素组成的对象使用PyVarObject,里面由:PyObject结构体(上一个对象、下一个对象、类型、引用个数)+Ob_size(items=元素,元素个数)。
小整数对象池一些整数在程序中的使用非常广泛,Python为了优化速度,使用了小整数对象池,避免为整数频繁申请和销毁内存空间。Python对小整数的定义是[-5, 257)这些整数对象是提前建立好的,不会被垃圾回收。在一个Python的程序中,所有位于这个范围内的整数使用的都是同一个对象。在一个Python的程序中,无论这个整数处于LEGB(局部变量,闭包,全局,内建模块)中的哪个位置,所有位于这个范围内的整数使用的都是同一个对象。
free_list机制当一个对象的引用计数器为0时,按理说应该回收,但内存不会直接回收,而是将对象添加到free_list链表中缓存。以后再去创建对象时,不再重新开辟内存,而是直接使用free_list。以上的free_list的代表:float,list,tuple,dict。
tuple类型,维护一个free_list数组且数组含量20,数组中元素可以是链表且每个链表最多可以含钠2000个元组对象。元组的free_list数据在存储数据时,是根据元组可容纳的个数为索引找到free_list数组中对应的链表,并添加到链表中。
引用计数法Python采用了类似Windows内核对象一样的方式来对内存进行管理。每一个对象,都维护这一个对指向该对对象的引用的计数。引用计数是计算机编程语言中的一种内存管理技术,它将资源被引用的次数保存起来,当引用次数变为0时就将资源释放。它管理的资源并不局限于内存,还可以是对象、磁盘空间等等。Python也使用引用计数这种方式来管理内存,每个Python对象都包含一个公共头部,头部中的ob_refcnt字段便用于维护对象被引用次数。回忆对象模型部分内容,我们知道一个典型的Python对象结构如下:
引用计数增加1对象被创建2如果有新的对象使用该对象3作为容器对象的一个元素4被作为参数传递给函数引用计数减少1对象的引用被显示的销毁2新对象不再使用该对象3对象从列表中被移除,或者列表对象本身被销毁4函数调用结束引用计数机制的优点简单实时性:一旦没有引用,内存就直接释放了。