垃圾回收机制

一. python垃圾回收机制

得益于Python的自动垃圾回收机制,在Python中创建对象时无须手动释放。这对开发者非常友好,让开发者无须关注低层内存管理。但如果对其垃圾回收机制不了解,很多时候写出的Python代码会非常低效。

二. 垃圾回收机制-算法

2.1 引用计数

1 原理:

1. 每个对象有一个整型的引用计数属性。用于记录对象被引用的次数。

2. 例如对象 A,如果有一个对象引用了A,则A的引用计数 +1。

3. 当引用删除时,A的引用计数 -1。

4. 当A的引用计数为0时,即表示对象A不可能再被使用,直接回收。

2 获取引用次数:
import sys
a = 1
num =  sys.getrefcount(a)
print(num)
3 优缺点

优点

1. 高效、逻辑简单,只需根据规则对计数器做加减法。

2. 实时性。一旦对象的计数器为零,就说明对象永远不可能再被用到,无须等待特定时机,直接释放内存。

缺点

1. 需要为对象分配引用计数空间,增大了内存消耗。

2. 当需要释放的对象比较大时,如字典对象,需要对引用的所有对象循环嵌套调用,可能耗时比较长。

3. 循环引用: 这是引用计数的致命伤,引用计数对此是无解的,因此必须要使用其它的垃圾回收算法对其进行补充。

2.2 标记清除

引用计数可能导致计数器永远都不会等于0,带来无法回收的问题。而标记清除可解决这一问题。

1 原理:

1. 标记阶段。将所有的对象看成图的节点,根据对象的引用关系构造图结构。从图的根节点遍历所有的对象,所有访问到的对象被打上标记,表明对象是“可达”的。

2. 清除阶段。遍历所有对象,如果发现某个对象没有标记为“可达”,则就回收。

2.3 分代回收

分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),他们对应的是3个链表,它们的垃圾收集频率随着对象存活时间的增大而减小。

1. 分代回收是建立在标记清除技术基础之上。

2. 新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

image

参考链接:https://blog.csdn.net/huachao1001/article/details/125722825

参考链接:https://blog.csdn.net/lbj1260200629/article/details/128323992

posted @ 2023-05-05 08:25  codegjj  阅读(2)  评论(0编辑  收藏  举报