一.引用计数
-
引用计数
定义: 引用计数是编程语言中的一种内存管理技术(GC Garabage Collection) 将资源(对象, 内存, 磁盘空间等) 的被引用次数保存起来引用次数变为零时资源将被释放 -
如何使引用计数减少
- del语句会删除一个引用, 这会让该引用指向的对象引用计数减一
- 注意: 任何追踪或调试程序会给对象增加一个额外引用, 这会推迟该对象被回收的时间
-
引用计数会导致什么问题
- 两个或两个以上的对象互相引用时, 彼此引用计数不为零, 造成循环引用无法回收, 这种情况出现时, Python中的循环引用有标记-清除可以解决
-
如何查看引用计数
import sys sys.getrefcount(obj)
二.标记-清除
-
什么是标记清除
标记清除会分为两个阶段, 首先标记对象, 然后清除垃圾
-
标记
在此阶段, 垃圾回收机制会从 "根对象" 开始遍历, 每一个可以从根对象访问到 的对象都会被标记为 "可到达对象", 可到达对象不被清除
-
清除
在此阶段中, 垃圾回收机制会对"堆内存"从头到尾进行"线性遍历" 如果发现有对象没有被标识为可到达对象, 那么久将此对象内存回收 之后将原来标记为可到达对象的标识抹掉, 以便进行下次垃圾回收操作
-
标记清除有什么问题
这个算法比较大的缺点就是垃圾收集后有可能会造成大量的内存碎片 其次因遍历的内存节点较多时, 每次回收都会将时间花费到遍历节点上
三.在垃圾回收算法中经常出现的mutator, collector
-
collector: 指的就是垃圾收集器
-
mutator: 指的是垃圾收集器之外的部分, 不日当前的应用程序, 它的功能是创建新的对象, 或在内存中读写内容
-
mutator roots: mutator根对象, 通常是分配在内存之外, 可以直接被mutator直接访问到的对象, 一般是指静态(全局变量)
-
可到达对象: 所谓的可到达对象就是从根对象开始遍历, 可以访问到的对象, 也就是mutator(应用程序)正在使用的对象
四.分代回收
-
分代回收是一种典型的以空间换时间的技术
对象存在时间越长, 越不可能是垃圾, 应该收拾时间短的
分代是解决内存遍历需要太久时间儿诞生的解决方案 -
分代回收可以减少标记-清除机制所带来的额外操作
-
将对象按时间分为三个段: 青年代, 中年代, 老年代, 每个段都是一个链表(集合), 当青年代满时, 将触发清理所有三代, 执行标记-清除动作
当中年代满时, 将触发清理中, 老年代
当老年代满时, 只会清理老年代自己
注意: 老年代是存在时间最长的