python内存管理
一、存储问题
(1)python会为每个对象分配一块内存空间去存储
(2)整数和短小的字符等,python执行缓存机制
(3)容器对象,如列表,元组,字典等,存储的其他对象,仅仅是其他对象的引用,即地址,非对象本身
容器对象:某些对象中会包含对其他对象的引用,这样的对象叫做容器对象
二、计数器
(1)一个对象记录着引用自己对象的个数
(2)查看引用对象个数的方法:导入sys模块,使用模块中getrefcount方法
当引用计数器方法,在检测到对象的引用个数为0时,对普通对象进行释放内存的机制
三、循环引用问题
即对象之间的相互引用,计数器无法对循环引用的对象内存进行释放
四、垃圾回收机制:将没用的对象删除(标记清除,标记---检测,清除--回收)
标记-清除:
(1)所有初始对象标记为白色,并确定根节点对象(这些对象不会被删除),标记为黑色(表示对象有效)
(2)将有效对象引用的对象标记为灰色(表示对象可达,但他们所引用的对象还没检查),检查完灰色对象引用的对象后,将灰色标记为黑色
(3)重复直到不存在灰色节点位置,最后白色节点都是需要清除对象
1、作用:从经过引用计数器机制后还没有被释放掉内存的对象中,找到循环引用对象,并释放掉其内存
2、垃圾回收检测流程:
(1)收集所有容器对象(循环引用只会针对容器对象,其他对象不会产生循环引用),使用双向链表(可以看做一个集合)对这些对象进行引用
(2)针对每一个容器对象,使用变量gc_refs来记录当前对应的应用个数
(3)对每个容器对象,找到其正在引用的其他容器对象,并将这个被引用的容器对象的引用计数减去1
(4)检查所有容器对象的引用计数,若为0,证明该容器对象由于循环引用存活下来,应对其进行销毁
3、提升查找循环引用过程的性能:分代回收(假设如果一个对象呗检测了10次还没有被销毁,就应该减少对其检测的频率)
(1)分代回收技术:对象存在时间越长,越可能不是垃圾,应该越少去收集
(2)python将内存根据对象存活时间划分为不同集合,每个集合称为一个代,python将内存分为3代,分别为“年轻代”(第0代),“中年代”(第1代),“老年代”(第2代),他们的垃圾收集频率与对象存活时间的增大而减小,新创建对象都会被分配到年轻代,年轻代链表的总数达到上限时,python垃圾收集机制就会被触发,把哪些可以被回收的对象回收掉,而不会被回收对象被移到中年代,以此类推,老年代中对象是存活时间最久的对象甚至存活于整个系统的生命周期内,同时,分代回收是建立在标记清除技术基础之上的,分代回收同样作为Python辅助垃圾收集技术处理容器对象
浙公网安备 33010602011771号