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中实现字符串类型与字典类型相互转换的方法
Aug 18 Python
Python解析xml中dom元素的方法
Mar 12 Python
Python中的Descriptor描述符学习教程
Jun 02 Python
python图像常规操作
Nov 11 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
Python 获得命令行参数的方法(推荐)
Jan 24 Python
python实现在IDLE中输入多行的方法
Apr 19 Python
用python编写第一个IDA插件的实例
May 29 Python
Python实现自定义读写分离代码实例
Nov 16 Python
Flask和pyecharts实现动态数据可视化
Feb 26 Python
python小白学习包管理器pip安装
Jun 09 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微信开发之音乐回复功能
2018/06/14 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
php实现微信分享朋友链接功能
2019/02/18 PHP
PHP如何将图片文件上传到另外一台服务器上
2019/08/26 PHP
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
Javascript 拖拽的一些简单的应用(逐行分析代码,让你轻松了拖拽的原理)
2015/01/23 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
javascript加减乘除的简单实例
2016/07/12 Javascript
Nodejs进阶:核心模块net入门学习与实例讲解
2016/11/21 NodeJs
AngularJS Controller作用域
2017/01/09 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
微信小程序中顶部导航栏的实现代码
2017/03/30 Javascript
解决ie img标签内存泄漏的问题
2017/10/13 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
详解JS取出两个数组中的不同或相同元素
2019/03/20 Javascript
js控制随机数生成概率代码实例
2019/03/21 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
django 通过url实现简单的权限控制的例子
2019/08/16 Python
Python pickle模块实现对象序列化
2019/11/22 Python
解决c++调用python中文乱码问题
2020/07/29 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
小学红领巾中秋节广播稿
2014/01/13 职场文书
部队万能检讨书
2014/02/20 职场文书
干部对照检查材料范文
2014/08/26 职场文书
怎样写离婚协议书
2014/09/10 职场文书
求职信格式范文
2015/03/19 职场文书
小学少先队活动总结
2015/05/08 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
python模板入门教程之flask Jinja
2022/04/11 Python