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的内存管理是以引用计数为主,标记清除和分代回收为辅的垃圾回收方式

相关推荐
IVEN_17 小时前
只会Python皮毛?深入理解这几点,轻松进阶全栈开发
python·全栈
Ray Liang19 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
AI攻城狮19 小时前
如何给 AI Agent 做"断舍离":OpenClaw Session 自动清理实践
python
千寻girling19 小时前
一份不可多得的 《 Python 》语言教程
人工智能·后端·python
AI攻城狮1 天前
用 Playwright 实现博客一键发布到稀土掘金
python·自动化运维
曲幽1 天前
FastAPI分布式系统实战:拆解分布式系统中常见问题及解决方案
redis·python·fastapi·web·httpx·lock·asyncio
孟健2 天前
Karpathy 用 200 行纯 Python 从零实现 GPT:代码逐行解析
python
码路飞2 天前
写了个 AI 聊天页面,被 5 种流式格式折腾了一整天 😭
javascript·python
Derek_Smart2 天前
从一次 OOM 事故说起:打造生产级的 JVM 健康检查组件
java·jvm·spring boot