python内存管理机制原理详解


Posted in Python onAugust 12, 2019

python内存管理机制:

  • 引用计数
  • 垃圾回收
  • 内存池

1. 引用计数

当一个python对象被引用时 其引用计数增加 1 ; 当其不再被变量引用时 引用计数减 1 ; 当对象引用计数等于 0 时, 对象被删除(引用计数是一种非常高效的内存管理机制)

2. 垃圾回收

垃圾回收机制: ① 引用计数 , ②标记清除 , ③分带回收

引用计数 :

引用计数也是一种垃圾收集机制, 而且也是一种最直观, 最简单的垃圾收集技术.当python某个对象的引用计数降为 0 时, 说明没有任何引用指向该对象, 该对象就成为要被回收的垃圾了.(如果出现循环引用的话, 引用计数机制就不再起作用了)

标记清除 :

如果两个对象的引用计数都为 1 , 但是仅仅存在他们之间的循环引用,那么这两个对象都是需要被回收的, 也就是说 它们的引用计数虽然表现为非 0 , 但实际上有效的引用计数为 0 ,.所以先将循环引用摘掉, 就会得出这两个对象的有效计数.

分带回收 :

从前面“标记-清除”这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾回收带来的额外操作就越少;反之,当需要回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额外操作。

3.内存池

内存池机制: python 中分为大内存和小内存: 256k为界限

大内存使用malloc 进行分配

小内存使用内存池是进行分配

python的内存池金字塔:

第3层: 最上层, 用户对python对象的直接操作

第1层和第2层: 内存池, 有python 的 接口函数 PyMen_Malloc 实现, 若请求分配的内存在1 - 256字节之间就使用内存池进行分配, 调用malloc 函数分配内存, 但是每次只会分配 256 k 的内存. 不会调用free 函数释放内层. 将该内存块留在内存池中便下次使用

第 0 层: 大内存 . 若请求分配的内存大于 256 k , malloc函数分配, free函数释放内存

第 - 1 -2 层: 操作系统进行操作

python内存管理机制原理详解

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

Python 相关文章推荐
在Python中操作字符串之replace()方法的使用
May 19 Python
Python运行报错UnicodeDecodeError的解决方法
Jun 07 Python
Python调用C语言的方法【基于ctypes模块】
Jan 22 Python
python中(str,list,tuple)基础知识汇总
Feb 20 Python
VSCode下好用的Python插件及配置
Apr 06 Python
python验证码识别教程之滑动验证码
Jun 04 Python
pandas DataFrame 行列索引及值的获取的方法
Jul 02 Python
python如何将多个PDF进行合并
Aug 13 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
python入门教程之基本算术运算符
Nov 13 Python
Python实现机器学习算法的分类
Jun 03 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 #Python
python实现图片压缩代码实例
Aug 12 #Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
Aug 12 #Python
一行Python代码过滤标点符号等特殊字符
Aug 12 #Python
一篇文章弄懂Python中的可迭代对象、迭代器和生成器
Aug 12 #Python
Django认证系统实现的web页面实现代码
Aug 12 #Python
django 自定义过滤器(filter)处理较为复杂的变量方法
Aug 12 #Python
You might like
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
php使用百度翻译api示例分享
2014/01/31 PHP
nginx下安装php7+php5
2016/07/31 PHP
laravel 5异常错误:FatalErrorException in Handler.php line 38的解决
2017/10/12 PHP
thinkPHP5实现的查询数据库并返回json数据实例
2017/10/23 PHP
PHP7 新增功能
2021/03/09 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
jQuery 入门讲解1
2009/04/15 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
基于jquery ajax 用户无刷新登录方法详解
2012/04/28 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
浅谈jquery设置和获得checkbox选中的问题
2016/08/19 Javascript
jQuery Validate让普通按钮触发表单验证的方法
2016/12/15 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
2017/02/20 Javascript
ionic 自定义弹框效果
2017/06/27 Javascript
微信小程序如何加载数据库真实数据的实现
2020/03/04 Javascript
使用Python绘制图表大全总结
2017/02/11 Python
Win10系统下安装labelme及json文件批量转化方法
2019/07/30 Python
Python sqlite3查询操作过程解析
2020/02/20 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
2020/06/10 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
HTML5在线预览PDF的示例代码
2017/09/14 HTML / CSS
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
办公室副主任岗位职责
2013/11/25 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
工程质量承诺书
2014/03/27 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
教师素质教育心得体会
2016/01/19 职场文书
详解Spring Bean的配置方式与实例化
2022/06/10 Java/Android
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers