python存储机制 || 垃圾回收机制 || 分代回收

关于python的存储问题

(1)由于python中万物皆对象,所以python的存储问题是对象的存储问题,并且对于每个对象,python会分配一块内存空间去存储它

(2)对于整数和短小的字符等,python会执行缓存机制,即将这些对象进行缓存,不会为相同的对象分配多个内存空间

(3)容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引用,即地址,并不是这些对象本身

 

垃圾回收机制

Python的垃圾回收机制采用引用计数机制为主,标记-清除和分代回收机制为辅的策略。

其中,标记-清除机制用来解决计数引用带来的循环引用而无法释放内存的问题,

分代回收机制是为提升垃圾回收的效率。

标记-清除用来解决引用计数机制产生的循环引用,进而导致内存泄漏的问题 。

循环引用只有在容器对象才会产生,比如字典,元组,列表等。

从基本原理上,当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,

该对象就成为要被回收的垃圾了。比如某个新建对象,它被分配给某个引用,对象的引用计数变为1。

如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。

 

分代回收

Python将所有的对象分为0,1,2三代;

所有的新建对象都是0代对象;

当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。

Python将所有的对象分为0,1,2三代。所有的新建对象都是0代对象。

当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。

垃圾回收启动时,一定会扫描所有的0代对象。如果0代经过一定次数垃圾回收,那么就启动对0代和1代的扫描清理。

当1代也经历了一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。

 

引用计数

Python通过引用计数来保存内存中的变量追踪,即记录该对象被其他使用的对象引用的次数。

Python中有个内部跟踪变量叫做引用计数器,每个变量有多少个引用,简称引用计数。当某个对象的引用计数为0时,就列入了垃圾回收队列。

>>> a=[1,2]
>>> import sys
>>> sys.getrefcount(a)  ## 获取对象a的引用次数
2
>>> b=a
>>> sys.getrefcount(a)
3
>>> del b  ## 删除b的引用
>>> sys.getrefcount(a)
2
>>> c=list()
>>> c.append(a) ## 加入到容器中
>>> sys.getrefcount(a)
3
>>> del c  ## 删除容器,引用-1
>>> sys.getrefcount(a)
2
>>> b=a
>>> sys.getrefcount(a)
3
>>> a=[3,4]  ## 重新赋值
>>> sys.getrefcount(a)
2

 

 

 

 

 

 

 

 

 

 

 

 

 

 
posted @ 2023-02-19 00:50  布衣梦蝶1978  阅读(79)  评论(0编辑  收藏  举报