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通过引用计数来保存内存中的变量追踪,即记录该对象被其他使用的对象引用的次数。
>>> 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