Python 内存管理机制全面分析


Posted in Python onJanuary 16, 2021

内存管理:

概述

在Python中,内存管理涉及到一个包含所有Python对象和数据结构的私有堆(heap). 这个私有堆的管理由内部的Python内存管理器保证。Python内存管理器有不同的组件来处理各种动态存储管理方面的问题,如共享,分割,预分配或缓存。

在最底层,一个原始内存分配器通过与操作系统的内存管理器交互,确保私有堆有足够的空间来存储所有与Python相关的数据。在原始内存分配器的基础上,几个对象特定的分配器在同一个堆上运行,并根据每种对象类型的特点实现不同的内存管理策略。例如,整数对象在堆内的管理方式不同于字符串,元祖,或者字典。因为整数需要不同的存储需求和速度与空间的权衡。因此,Python内存管理器将一些工作分配给对象特定分配器,但确保后者在私有堆的范围内运行。

Python堆内存的管理由解释器来执行,用户对他没有控制权,即使他们经常操作只想堆内存块的对象指针,理解这一点非常重要。Python对象和其他内部缓冲区的堆空间分配是由Python内存管理器按需通过本文档中列出的Python/C API函数进行的。

内存管理机制

Python的内存管理总共分为4层(Layer0-3)

Python 内存管理机制全面分析

第一层Layer1的仅仅是对malloc的简单包装, raw memory,目的是为了兼容各个操作系统,因为不同的操作系统调用malloc的时候可能会有不同的行为结果;第二层Layer2是内存管理机制的核心,其中gc就是在这一层发挥至关重要的作用。第三层,是对象缓冲池,如Python对一些对象的直接操作,包括int,list等

对于可能被经常使用,而且是immutable的对象,如bool类型,元祖类型,小的整数,长度较短的字符串等,Python会缓存在layer3,直接供Python调用,避免频繁的创建和销毁。'

当一个对象逻辑上不被使用了,但并没有被释放,那么就存在内存泄漏,很可能会造成程序效率低下甚至崩溃

Python分配内存的时候又分为大内存和小内存,大内存以256字节为界限,对于大内存使用Malloc进行分配,而对于小内存则使用内存池进行分配,由于小内存的分配和释放是频繁的,因此内存池的使用大大提高了Python的执行效率。

引用计数

在Python中大多数对象的生命周期都是通过引用计数来管理的,引用技术也是一种最直观最简单的垃圾收集技术

每个Python对象都有一个引用计数器,用于记录多少变量指向这个对象,可以通过sys模块的getrefcount查询获得

Python 内存管理机制全面分析

每一个对象都会维护一个引用计数器,当一个对象被引用的时候,它的计数器就+1,当一个对象的引用被销毁的时候,计数器-1,当这个对象的引用计数为0的时候,说明这个对象已经没有使用了,可以被释放,就会被回收,具有实时性。由于引用计数需要维护计数器等额外的操作,为了与引用计数搭配,在内存的分配和释放上获得最高的效率,Python因此设计了大量的内存池机制。

下面这些情况引用计数+1

(1). 对象被创建: a = 4

(2). 引用被复制: y = x

(3). 被作为参数传递给函数: f(x)

(4). 作为容器对象的一个元素: a = [1, x]

下面这些情况引用计数-1

(1). 离开作用域,比如f(x)函数结束的时候,x只想的对象引用减1

(2). 引用被显式地销毁: del x

(3). 对象的一个别名被赋值给其他对象: y = 1

(4). 对象从一个容器对象中移除: l.remove(x)

(5). 容器对象本身被销毁: del l 

Python的内存管理主要以引用计数为主,引用计数机制能释放大部分无用对象,除了第一种情况,循环引用,因为循环引用的对象那个引用计数器永不为0。

循环引用,就是一个对象直接或者间接引用自己本身,导致计数器不为0

以上就是Python 内存管理机制全面分析的详细内容,更多关于python 内存管理机制的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 基础教程之包和类的用法
Feb 23 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python实现一个简单的验证码程序
Nov 03 Python
python之virtualenv的简单使用方法(必看篇)
Nov 25 Python
Python实现简单的文本相似度分析操作详解
Jun 16 Python
Python告诉你木马程序的键盘记录原理
Feb 02 Python
Django框架封装外部函数示例
May 28 Python
django框架单表操作之增删改实例分析
Dec 16 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python生成任意频率正弦波方式
Feb 25 Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 Python
分享一个python的aes加密代码
Dec 22 Python
python des,aes,rsa加解密的实现
Jan 16 #Python
python math模块的基本使用教程
Jan 16 #Python
详解Python模块化编程与装饰器
Jan 16 #Python
删除pycharm鼠标右键快捷键打开项目的操作
Jan 16 #Python
基于pycharm 项目和项目文件命名规则的介绍
Jan 15 #Python
python制作抽奖程序代码详解
Jan 15 #Python
python中PyQuery库用法分享
Jan 15 #Python
You might like
一个php作的文本留言本的例子(二)
2006/10/09 PHP
Codeigniter通过SimpleXML将xml转换成对象的方法
2015/03/19 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
JQuery Tips(2) 关于$()包装集你不知道的
2009/12/14 Javascript
元素未显示设置width/height时IE中使用currentStyle获取为auto
2014/05/04 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
Jquery代码实现图片轮播效果(一)
2015/08/12 Javascript
使用Promise解决多层异步调用的简单学习心得
2016/05/17 Javascript
原生js实现新闻列表展开/收起全文功能
2017/01/20 Javascript
JS出现失效的情况总结
2017/01/20 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
2017/03/10 Javascript
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
React-Native中禁用Navigator手势返回的示例代码
2017/09/09 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
实例讲解JavaScript 计时事件
2020/07/04 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
python Flask 装饰器顺序问题解决
2018/08/08 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
python读取当前目录下的CSV文件数据
2020/03/11 Python
Amaze UI 文件选择域的示例代码
2020/08/26 HTML / CSS
美国眼镜网:GlassesUSA
2017/09/07 全球购物
美国最好的钓鱼、狩猎和划船装备商店:Bass Pro Shops
2018/12/02 全球购物
英语专业毕业生自荐信范文
2013/12/31 职场文书
电子商务自荐书范文
2014/01/04 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
个人承诺书
2014/03/26 职场文书
高老头读书笔记
2015/06/30 职场文书
关于国庆节的广播稿
2015/08/19 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书