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

相关推荐
夏天拐跑了西瓜25 分钟前
一文入门LangChain:从框架认知到构建你的第一个AI Agent
python·langchain·conda·agent
魔猴疯猿1 小时前
从0到1用Python开发第一个智能体
人工智能·python·深度学习·神经网络·机器学习
wuminyu2 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
m0_380743872 小时前
C++中的freopen的用法实例详解
开发语言·c++
xiaoqi01952 小时前
机器学习因子分析实战:从量化特征到可视化决策
人工智能·python·机器学习
Escalating_xu2 小时前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
jimy13 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
m0_380743873 小时前
PHP 8.3 缓存清除不生效怎么排查
开发语言·php
happylifetree3 小时前
Python14:核心语法-数据存储与运算-字符串定义
python
hhb_6183 小时前
AIRAGDebug:一键定位RAG链路异常
人工智能·python·算法