简单了解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中字典(dict)和列表(list)的排序方法实例
Jun 16 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
Python的time模块中的常用方法整理
Jun 18 Python
使用python实现个性化词云的方法
Jun 16 Python
Python基础之getpass模块详细介绍
Aug 10 Python
对Python中数组的几种使用方法总结
Jun 28 Python
python编写猜数字小游戏
Oct 06 Python
Python搭建Keras CNN模型破解网站验证码的实现
Apr 07 Python
Python中常见的数制转换有哪些
May 27 Python
Python CSS选择器爬取京东网商品信息过程解析
Jun 01 Python
python mongo 向数据中的数组类型新增数据操作
Dec 05 Python
Python中itertools库的四个函数介绍
Apr 06 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
收音机怀古---春雷3P7图片欣赏
2021/03/02 无线电
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
c#中的实现php中的preg_replace
2009/12/21 PHP
php判断用户是否关注微信公众号
2016/07/22 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
使用Mootools动态添加Css样式表代码,兼容各浏览器
2011/12/12 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
2014/06/23 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
angular forEach方法遍历源码解读
2017/01/25 Javascript
jQuery实现用户输入自动完成功能
2017/02/13 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
小程序点赞收藏功能的实现代码示例
2018/09/07 Javascript
基于JavaScript实现每日签到打卡轨迹功能
2018/11/29 Javascript
如何使用Jquery动态生成二级选项列表
2020/02/06 jQuery
原生js+canvas实现贪吃蛇效果
2020/08/02 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
浅谈python for循环的巧妙运用(迭代、列表生成式)
2017/09/26 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
selenium+python截图不成功的解决方法
2019/01/30 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
让IE9以下版本的浏览器兼容HTML5的方法
2014/03/12 HTML / CSS
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
总结html5自定义属性有哪些
2020/04/01 HTML / CSS
乐高积木玩具美国官网:LEGO Shop US
2016/09/16 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
写自荐信三大法宝
2014/01/24 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
学生实习证明范文
2014/09/28 职场文书
2015年九一八事变纪念活动实施方案
2015/05/06 职场文书
教师节主题班会教案
2015/08/17 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript