当前位置: 首页 > news >正文

python-内存管理

python-内存管理

  • 前言
  • 一、内存分配
  • 二、引用计数
  • 三、垃圾回收
  • 总结


前言

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

一、内存分配

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

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

整数池

简单字符串驻留区
没有包含特殊字符的字符串,创建之后会存在内存缓存中
新建简单字符串对象,会先查看内存缓存中有没有这个相同的字符串。如果有,直接赋值,没有就新建

字符串驻留区


二、引用计数

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

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

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

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

http://www.dtcms.com/a/302111.html

相关文章:

  • 【FAQ】MS Dynamics 365 Sales配置方法汇总
  • Linux中应用程序的安装于管理
  • Java面试宝典:Spring Boot
  • 基于BEKK-GARCH模型的参数估计、最大似然估计以及参数标准误估计的MATLAB实现
  • 【Linux学习】(12)环境变量
  • 自定义spring-boot-starter
  • STM32F4—电源管理器
  • 网络安全笔记
  • 图像处理第三篇:初级篇(续)—— 照明的理论知识
  • Springboot社区养老保险系统小程序
  • 基础算法思想——分治
  • 服务器防护教程 - 宝塔篇
  • 大模型应用开发1-认识大模型
  • 【Linux】编辑器vim和编译器gcc/g++
  • go‑cdc‑chunkers:用 CDC 实现智能分块 强力去重
  • mp快速入门
  • AI在编程、测试、数据分析等领域的前沿应用(技术报告)
  • 深度思考和搜索研究 最新的GSPO强化学习算法
  • 第六届金头脑杯夏季巅峰挑战:以智慧之名,点亮幼儿成长之路
  • RV1126B-P机器视觉应用AIoT及边缘计算算力达2.0支持 HDR 、 3DNR
  • Java设计模式之<建造者模式>
  • Go 语言面试题
  • window显示驱动开发—Direct3D 11 视频播放改进
  • WPF,按钮透明背景实现MouseEnter
  • 二级域名分发源码最新开源版
  • 使用Ettus USRP X440对雷达和EW系统进行原型验证
  • 【实时Linux实战系列】基于实时Linux的智能家居系统设计
  • 电脑开机不显示网卡的原因
  • LLM学习笔记5——InstructGPT
  • 用AI压缩音视频,如何让尺寸更紧凑?