python-内存管理

python-内存管理


前言

在 Python 中,内存管理是由 Python 解释器自动处理的,开发者无需手动分配和释放内存

一、内存分配

python引入小整数池和简单字符串驻留区机制

小整数池

范围: [-5, 256]

如果赋值的数,在小整数池范围内,就直接将这个数赋值给变量,不会重新创建对象了

简单字符串驻留区

没有包含特殊字符的字符串,创建之后会存在内存缓存中

新建简单字符串对象,会先查看内存缓存中有没有这个相同的字符串。如果有,直接赋值,没有就新建


二、引用计数

每个对象都维护一个ob_ref的字段,记录该对象的引用

  1. 如果有新的引用过来,字段值加1
  2. 如果有引用被释放,字段值减1
  3. 该对象引用计数为0,那么该对象就会被释放
py 复制代码
x = [1, 2, 3]  # 列表对象引用计数为1
y = x         # 引用计数为2
del x         # 引用计数为1
del y         # 引用计数为0,对象被释放

引用计数解决不了循环引用的问题

py 复制代码
x = [1]
y = [2]
x.append(y)
y.append(x)
del x
del y
# 列表 A 和 B 的引用计数均为 1,但它们无法被程序访问
# 形成内存泄漏 -> 垃圾回收

三、垃圾回收

开启垃圾回收 -- STW STOP THE WORLD

标记清除

遍历对象 标记为活跃或者不活跃 最后删除不活跃对象

分代回收

  1. 认为存活越久的对象,越不可能成为垃圾
  2. 将所有的新增对象划为0代对象,每次扫描都要检查0代对象
  3. 当0代对象经过10次扫描之后,依然存活,就变为1代对象,对0代对象扫描10次,才会扫描1代对象
  4. 当1代对象经过10次扫描之后,依然存活,就变为2代对象。对1代扫描10次,就会开启全盘扫描

总结

python的内存管理是以引用计数为主,标记清除和分代回收为辅的垃圾回收方式

相关推荐
yaoh.wang4 分钟前
力扣(LeetCode) 66: 加一 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
222you15 分钟前
Java线程的三种创建方式
java·开发语言
云上漫步者21 分钟前
深度实战:Rust交叉编译适配OpenHarmony PC——unicode_width完整适配案例
开发语言·后端·rust·harmonyos
漫漫求25 分钟前
Java内存模型【JMM】、JVM内存模型
java·开发语言·jvm
田姐姐tmner31 分钟前
Python 全面语法指南
开发语言·python
white-persist40 分钟前
【攻防世界】reverse | simple-check-100 详细题解 WP
c语言·开发语言·汇编·数据结构·c++·python·算法
wuguan_44 分钟前
C#中的静态成员、常量和只读变量
开发语言·c#
张人玉1 小时前
C# 与西门子 PLC 通信:地址相关核心知识点
开发语言·microsoft·c#·plc
王大傻09281 小时前
Series的属性简介
python·pandas
Gomiko1 小时前
JavaScript DOM 原生部分(五):事件绑定
开发语言·前端·javascript