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程序中操作文件之isatty()方法的使用教程
May 24 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
Python实现统计代码行的方法分析
Jul 12 Python
python中的二维列表实例详解
Jun 19 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
Jun 21 Python
python代理工具mitmproxy使用指南
Jul 04 Python
Python缓存技术实现过程详解
Sep 25 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
Python socket连接中的粘包、精确传输问题实例分析
Mar 24 Python
PyInstaller的安装和使用的详细步骤
Jun 02 Python
Python中关于logging模块的学习笔记
Jun 03 Python
对Keras自带Loss Function的深入研究
May 25 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 身份验证方面的函数
2009/10/11 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
PHP PDO fetch 模式各种参数的输出结果一览
2015/01/07 PHP
smarty模板引擎中内建函数if、elseif和else的使用方法
2015/01/22 PHP
php while循环控制的简单实例
2016/05/30 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
jQuery autocomplete插件修改
2009/04/17 Javascript
jQuery实现鼠标滑过遮罩并高亮显示效果
2013/07/16 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
微信小程序开发之toast等弹框提示使用教程
2017/06/08 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
JS简单实现查看文档创建日期、修改日期和文档大小的方法示例
2018/04/08 Javascript
jquery分页优化操作实例分析
2019/08/23 jQuery
ES5新增数组的实现方法
2020/05/12 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
[14:03]2017DOTA2亚洲邀请赛开幕式:12神兵演绎水墨中华
2017/04/01 DOTA
给Python中的MySQLdb模块添加超时功能的教程
2015/05/05 Python
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python各类图像库的图片读写方式总结(推荐)
2018/02/23 Python
python 每天如何定时启动爬虫任务(实现方法分享)
2018/05/21 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
Python + selenium + requests实现12306全自动抢票及验证码破解加自动点击功能
2018/11/23 Python
python使用yield压平嵌套字典的超简单方法
2019/11/02 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
python实现拼图小游戏
2020/02/22 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
基于PyTorch的permute和reshape/view的区别介绍
2020/06/18 Python
html5中canvas学习笔记1-画板的尺寸与实际显示尺寸
2013/01/06 HTML / CSS
什么时候需要进行强制类型转换
2016/09/03 面试题
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP