内存管理

python中的内存管理机制的层次有四层,最底层的C运行的malloc和free接口,其余三层则是有Python实现并且维护的。

假设四层中第一层由C运行的接口,第二层则是基于第一层基础之上,对其提供的接口进行了统一的封装。
    第三层内存管理机制上,python构建了更高抽象的内存管理策略,比如说一些常用的对象,包括整数对象、字符串对象等。
    第四层只要是对象缓冲池机制,基于第三层的'内存池'建立

内存池

python为了避免频繁的申请和删除内层所造成系统切换与用户态和核心态的开销,引入了内存池机制,专门用来管理小内存的申请和释放。

垃圾回收机制

​不能被程序访问到的数据,就被称之为垃圾。

引用计数

# 假设在python中定义
a = 10 ; b = 10
# 假设 10在内存中的 id为10001
a 和 b 的id会同时指向 10001
此时10的计数为 2 
当我们 del a
这时候没有变量 a, 10的引用计数变为 1
若在删除 b,那么 10 的引用计数则为 0 
但变为 0 不会立刻删除,满足条件
多长时间 或 达到阈值 时会被垃圾回收机制删除


# 引用计数就是用来记录值的内存地址被记录的次数
# 对值的地址的引用都会使该值得引用计数 +1
# 对值的地址的释放都会使该值得引用计数 -1
# 当一个值的引用计数为0时,该值就会被系统的垃圾回收机制回收

# 循环导入会使得某些值的引用计数永远大于0  ==> 内存泄漏

标记清除

# 把所有线程和栈区能访问到的对应堆区的内容标记为存活状态,阈值一般都不会超过存储区域的一半,将存活的内容全部拷贝到另外一半,将原先的部分全部删除。


# 标记:标记的过程其实就是,遍历所有的GC Roots对象(栈区中的所有内容或者线程都可以作为GC Roots对象),然后将所有GC Roots的对象可以直接或间接访问到的对象标记为存活的对象,
存放到新的内存空间中
# 删除:删除的过程将遍历堆中所有的对象,将之前所有的内容全部清除

分代回收

# 分代:指的是根据存活时间来为变量划分不同等级(也就是不同的代)

新定义的变量,放到新生代这个等级中,假设每隔1分钟扫描新生代一次,如果发现变量依然被引用,那么该对象的权重(权重本质就是个整数)加一,当变量的权重大于某个设定得值(假设为3),
会将它移动到更高一级的青春代,青春代的gc扫描的频率低于新生代(扫描时间间隔更长),假设5分钟扫描青春代一次,这样每次gc需要扫描的变量的总个数就变少了,节省了扫描的总时间,
接下来,青春代中的对象,也会以同样的方式被移动到老年代中。也就是等级(代)越高,被垃圾回收机制扫描的频率越低

回收:依然是使用引用计数作为回收的依据

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务