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算法之栈(stack)的实现
Aug 18 Python
python中os操作文件及文件路径实例汇总
Jan 15 Python
在Linux上安装Python的Flask框架和创建第一个app实例的教程
Mar 30 Python
利用Python自带PIL库扩展图片大小给图片加文字描述的方法示例
Aug 08 Python
Python递归实现汉诺塔算法示例
Mar 19 Python
python读取word文档,插入mysql数据库的示例代码
Nov 07 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
学Python 3的理由和必要性
Nov 19 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
Apr 29 Python
教你怎么用Python实现GIF动图的提取及合成
Jun 15 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防注入漏洞过滤函数代码
2012/04/11 PHP
Php中用PDO查询Mysql来避免SQL注入风险的方法
2013/04/25 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
php屏蔽错误及提示的方法
2020/05/10 PHP
js 数组操作代码集锦
2009/04/28 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
JS注册/移除事件处理程序(ExtJS应用程序设计实战)
2013/05/07 Javascript
对table和ul实现js分页示例分享
2014/02/24 Javascript
JavaScript中数组成员的添加、删除介绍
2014/12/30 Javascript
jQuery中使用each处理json数据
2015/04/23 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
打造通用的匀速运动框架(实例讲解)
2017/10/17 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
Vue分页效果与购物车功能
2019/12/13 Javascript
Python变量作用范围实例分析
2015/07/07 Python
Python实现完整的事务操作示例
2017/06/20 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
flask-restful使用总结
2018/12/04 Python
python实现扫描局域网指定网段ip的方法
2019/04/16 Python
Python内置random模块生成随机数的方法
2019/05/31 Python
pytorch 可视化feature map的示例代码
2019/08/20 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
在django中使用post方法时,需要增加csrftoken的例子
2020/03/13 Python
Django项目uwsgi+Nginx保姆级部署教程实现
2020/04/19 Python
python用Configobj模块读取配置文件
2020/09/26 Python
python 写一个性能测试工具(一)
2020/10/24 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
九年级历史教学反思
2014/01/27 职场文书
幼儿园大班家长评语
2014/04/17 职场文书
大型会议策划方案
2014/05/17 职场文书
医学专业大学生职业生涯规划书
2014/10/25 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
关于Python使用turtle库画任意图的问题
2022/04/01 Python
navicat 连接Ubuntu虚拟机的mysql的操作方法
2022/04/02 MySQL