简单了解python的内存管理机制


Posted in Python onJuly 08, 2019

Python引入了一个机制:引用计数。

引用计数

python内部使用引用计数,来保持追踪内存中的对象,Python内部记录了对象有多少个引用,即引用计数,当对象被创建时就创建了一个引用计数,当对象不再需要时,这个对象的引用计数为0时,它被垃圾回收。

总结一下对象会在一下情况下引用计数加1:

1.对象被创建:x=4

2.另外的别人被创建:y=x

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

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

引用计数减少情况

1.一个本地引用离开了它的作用域。比如上面的foo(x)函数结束时,x指向的对象引用减1。

2.对象的别名被显式的销毁:del x ;或者del y

3.对象的一个别名被赋值给其他对象:x=789

4.对象从一个窗口对象中移除:myList.remove(x)

5.窗口对象本身被销毁:del myList,或者窗口对象本身离开了作用域。

垃圾回收

1、当内存中有不再使用的部分时,垃圾收集器就会把他们清理掉。它会去检查那些引用计数为0的对象,然后清除其在内存的空间。当然除了引用计数为0的会被清除,还有一种情况也会被垃圾收集器清掉:当两个对象相互引用时,他们本身其他的引用已经为0了。

2、垃圾回收机制还有一个循环垃圾回收器, 确保释放循环引用对象(a引用b, b引用a, 导致其引用计数永远不为0)。

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。

内存池机制

Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。

Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的 malloc。另外Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
简单上手Python中装饰器的使用
Jul 12 Python
基于DATAFRAME中元素的读取与修改方法
Jun 08 Python
Python列表生成式与生成器操作示例
Aug 01 Python
Python实现八皇后问题示例代码
Dec 09 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
Dec 11 Python
让你Python到很爽的加速递归函数的装饰器
May 26 Python
python打包exe开机自动启动的实例(windows)
Jun 28 Python
Python图像处理之图片文字识别功能(OCR)
Jul 30 Python
Django 自定义权限管理系统详解(通过中间件认证)
Mar 11 Python
python中turtle库的简单使用教程
Nov 11 Python
Python根据URL地址下载文件并保存至对应目录的实现
Nov 15 Python
Python中for后接else的语法使用
May 18 Python
python用for循环求和的方法总结
Jul 08 #Python
python面试题之列表声明实例分析
Jul 08 #Python
python 一个figure上显示多个图像的实例
Jul 08 #Python
Python3实现汉语转换为汉语拼音
Jul 08 #Python
python如何爬取网站数据并进行数据可视化
Jul 08 #Python
Django后台admin的使用详解
Jul 08 #Python
Python画图实现同一结点多个柱状图的示例
Jul 07 #Python
You might like
做个自己站内搜索引擎
2006/10/09 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
摘自织梦CMS的HTTP文件下载类
2015/08/08 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
基于Jquery实现仿百度百科右侧导航代码附源码下载
2015/11/27 Javascript
Linux下为Node.js程序配置MySQL或Oracle数据库的方法
2016/03/19 Javascript
javascript的几种继承方法介绍
2016/03/22 Javascript
Javascript基础教程之比较null和undefined值
2016/05/16 Javascript
全面解析Bootstrap中tab(选项卡)的使用方法
2016/06/06 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
解决vue项目打包上服务器显示404错误,本地没出错的问题
2020/11/03 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
Python写的一个定时重跑获取数据库数据
2016/12/28 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
python监控进程状态,记录重启时间及进程号的实例
2019/07/15 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
浅谈django channels 路由误导
2020/05/28 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
教师年终个人自我评价
2013/10/04 职场文书
《寓言两则》教学反思
2014/02/27 职场文书
廉洁自律承诺书
2014/03/27 职场文书
五水共治捐款倡议书
2014/05/14 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
教师节横幅标语
2014/10/08 职场文书
邀请书格式范文
2015/02/02 职场文书
MySQL连接控制插件介绍
2021/09/25 MySQL