简单了解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 datetime时间格式化去掉前导0
Jul 31 Python
实例探究Python以并发方式编写高性能端口扫描器的方法
Jun 14 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
Python测试模块doctest使用解析
Aug 10 Python
Cython编译python为so 代码加密示例
Dec 23 Python
python各层级目录下import方法代码实例
Jan 20 Python
python str字符串转uuid实例
Mar 03 Python
Python IDE环境之 新版Pycharm安装详细教程
Mar 05 Python
利用Python自动化操作AutoCAD的实现
Apr 01 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
Keras Convolution1D与Convolution2D区别说明
May 22 Python
Django filter动态过滤与排序实现过程解析
Nov 26 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
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
网页里控制图片大小的相关代码
2006/06/25 Javascript
利用Dojo和JSON建立无限级AJAX动态加载的功能模块树
2007/03/24 Javascript
javascript中的toFixed固定小数位数 简单实例分享
2013/07/12 Javascript
js/jquery解析json和数组格式的方法详解
2014/01/09 Javascript
如何使用HTML5地理位置定位功能
2015/04/27 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
jQuery zclip插件实现跨浏览器复制功能
2015/11/02 Javascript
js微信分享API
2020/10/11 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
nodejs的安装使用与npm的介绍
2019/09/11 NodeJs
JS中比较两个Object数组是否相等方法实例
2019/11/11 Javascript
vue下canvas裁剪图片实例讲解
2020/04/16 Javascript
vue组件开发之tab切换组件使用详解
2020/08/21 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
Python urlopen 使用小示例
2008/09/06 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python urllib爬虫模块使用解析
2019/09/05 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
来自美国主售篮球鞋的零售商店:KICKSUSA
2017/11/28 全球购物
为什么使用接口?
2014/08/13 面试题
物业保安主管岗位职责
2013/12/25 职场文书
个人简历中自我评价
2014/02/11 职场文书
乐观自信演讲稿范文
2014/05/21 职场文书
上课随便讲话检讨书
2014/09/12 职场文书
查摆问题自查报告范文
2014/10/13 职场文书
2014年物流工作总结
2014/11/25 职场文书
蜗居观后感
2015/06/11 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
SQL bool盲注和时间盲注详解
2022/07/23 SQL Server