python的内存管理机制

Python的内存管理机制

一、引用计数:通过引用计数来保持对内存中的变量跟踪,Python内部记录中所有在使用对象各有多少个引用。
Python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用,简称引用计数。当对象被创建时就创建了一个引用计数。
当某个对象的引用计数为0时,对象就不在需要,就列入了垃圾回收队列。
引用计数增加:

1.对象被创建:x=4;

2.另外的别人被创建:y=x;

3.被作为参数传递给函数:foo(x);

4.作为容器对象的一个元素:a=[1,x,'33'];
引用计数减少时:

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1;

2.对象的别名被显式的销毁:del x ;或者del y;

3.对象的一个别名被赋值给其他对象:x=100

4.对象从一个窗口对象中移除:mylist.remove(x)

5.窗口对象本身被销毁:del mylist,或者窗口对象本身离开了作用域。

二、垃圾回收

1.引用计数: 每个对象中都有ob-refcnt来做引用计数。每当新的引用指向该对象时,ob-refcnt就会增加,当引用的对象删除,那么ob-refcnt就会减少当ob-refcnt为零,就会释放该对象的内存空间
2.标记清除: 解决循环引用的问题。先按需分配,等到没有空闲内存的时候,从寄存器和程序栈上的引用出发,遍历所有对象和引用把所有能访问的打标记,最后将没有标记的对象释放掉
3.分代技术: 提高效率,提高垃圾回收的效率,按照存活时间,分成不同的集合。将内存块按照其存活时间划分为不同的集合。每个集合就称为一个“代”,垃圾回收的频率随代的存活时间增大而减小。。Python默认定义分代对象集合,引用数越大,对象的存活时间越长

三、内存池机制

在Python中,大多数申请的都是小块的内存,会执行大量的malloc和free操作。Python引入了一个内存池机制,用于管理对小块内存的申请和释放,即Pymalloc机制。
它将不用的内存放到内存池而不是返回给操作系统。
1. 当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。
2. 对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

posted @ 2017-12-05 20:21  吃柚子的小白  阅读(126)  评论(0编辑  收藏  举报