Python内存管理机制和垃圾回收机制的简单理解
一、内存管理机制
1.由c开发出来的cpython
2.include / objests
3.需要下载python源码包
4.Pyobject:float
PyVarObject:
5.在python中所有东西创建对象的时候,内部都会存储一个数据
// 维护双向链表
struct _object *_ob_next;
struct _object *_ob_prev;
// 应用计数器
Py_ssize_t ob_refcnt;
// 类型
struct _typeobject *ob_type;
如果是有多个元素组成的话,内部会再多维护一个
Py_ssize_t ob_size; /* Number of items in variable part */
6.在创建对象时,如:
操作:
v = 0.3
源码内部:
a.开辟内存
b.初始化
ob_fval=0.3
ob_type=float
ob_refcnt=1
c.将对象加入到双向链表中 ref_chain
操作:
name = v
源码内部:
ob_refcnt+1
操作:
del v
源码内部:
ob_refcnt-1
操作:
def fun(arg):
print(123)
fun(name)
源码内部:
刚进去:ob_refcnt+1
执行完:ob_refcnt-1
操作:
del name
源码内部:
ob_refcnt-1
每次应用计数器减一时,都会检查是否为0,如果是0则认为他是垃圾,就对它进行回收
内存管理机制
Python是由c语言开发,操作都是基于底层的c语言实现的,Python中创建每个对象,内部都会与c语言结构体维护一些值
Pyobject
指针指向上面的数据
指针指向下面的数据
计数器
类型
PyVarObject
PyObject
容量个数
在创建对象时,每个对象至少内部有四个值:双向链表/ob_refcnt/ob_type,之后对内存中的数据进行初始化,初始化本质:引用计数器=1,赋值,然后将对象添加到双向链表中,以后再有其他变量执行这个内存,则让引用计数器+1,如果销毁某个变量,则找到指向的内存,将其引用计数器-1
引用计数器如果为零则进行垃圾回收
在内部可能存在缓存机制,例如:float/int/list,最开始不会真正销毁,而是放在free_list的链表中,以后在创建同类型的数据时,会先去链表中取出对象,然后在对对象进行初始化。
(float内存管理中默认缓存100个/list内存管理中默认缓存10个)
二、垃圾回收机制
引用计数器为主,标记清楚和分代回收为辅
1.引用计数器
引用计数器同上内存管理中的描述
引用计数器会出现循环引用
(1)
a = [1, 2]
b = [4, 5]
a.append(b) # a中的第三个元素指向b,b的计数器发生变化,变成2了
(2)
del a
del b
# 当这种代码特别多的时候,内存的占用也会特别多,内存占用特别多的时候会造成内存泄漏(溢出)
2.标记清除
标记清除可以用来解决内存泄漏的问题
针对那些容器类型的对象,在Python中会将他们单独放到一个双向链表中,做定期扫描,检查是否有循环引用,如果有各自-1,如果-1之后等于0,则直接回收。
3.分代回收
为了减少对象的扫描,将没有问题的对象让他放到上一级的链表中,默认下一级扫描10次上一级才扫描1次,一共有三代链表
Python内存管理机制和垃圾回收机制的简单理解的更多相关文章
- JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代
内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...
- Python内存管理方式和垃圾回收算法解析
在列表,元组,实例,类,字典和函数中存在循环引用问题.有 __del__ 方法的实例会以健全的方式被处理.给新类型添加GC支持是很容易的.支持GC的Python与常规的Python是二进制兼容的. 分 ...
- JVM内存管理机制和垃圾回收机制
JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...
- JVM内存管理和JVM垃圾回收机制
JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...
- php内存管理机制与垃圾回收机制
PHP内存管理机制 1 var_dump(memory_get_usage()); //获取内存 2 $a = "laruence"; //定义一个变量 3 var_dump(me ...
- php内存管理机制、垃圾回收机制
一.内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = ...
- JVM的内存区域划分以及垃圾回收机制详解
在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...
- JS 从内存空间谈到垃圾回收机制
壹 ❀ 引 从事计算机相关技术工作的同学,对于内存空间相关概念多少有所耳闻,毕竟像我这种非计算机科班出身的人,对于栈堆,垃圾回收都能简单说道几句:当我明白JS 基本类型与引用类型数据存储方式不同,才 ...
- Python程序运行流程与垃圾回收机制
Python程序运行流程 Python解释器首先将程序将py文件编译成一个字节码对象PyCodeObject(只存在于内存中).(当这个模块的 Python 代码执行完后,就会将编译结果保存到了pyc ...
- python进阶(7)垃圾回收机制
Python垃圾回收 基于C语言源码底层,让你真正了解垃圾回收机制的实现 引用计数器 标记清除 分代回收 缓存机制 Python的C源码(3.8.2版本) 1.引用计数器 1.1环状双向链表 refc ...
随机推荐
- vue-elementui中el-table跨页选择和v-if导致列错乱/选择框无法显示
在vue-elementui中使用el-table,当type="selection"的时候,分页数据进行不同页跳转选择 需要这种功能的时候我们需要在el-table的标签上为每个 ...
- Solr的学习使用之(七)Solr高级查询facet、facet.pivot简介 - OnTheRoad_Lee
http://martin3000.iteye.com/blog/1330106 1 .什么是Faceted Search Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yoni ...
- Avalonia UI 中 Styles 与 ControlTheme 的区别
目录 目录 介绍 使用方式 全局主题 (Global Theme) 局部主题 (Local Theme) 控件主题 (ControlTheme) 问题描述 问题分析 问题1 区别 问题2 重写Temp ...
- python系统模块之re
正则模块re: 元字符: 字符 描述 . 除换行符外的任意字符 \ 转义字符 [...] 字符集合,匹配任务其中一个 \d 数字:[0-9] \D 非数字:[^\d] \w 单词字符[A-Za-z0- ...
- Graylog之基本使用
文档:https://docs.graylog.org/en/3.0/ Graylog Sidecar是一个轻量级配置管理系统,适用于不同的日志收集器,也称为后端.Graylog节点充当包含日志收集器 ...
- Educational Codeforces Round 132 (Rated for Div
Educational Codeforces Round 132 (Rated for Div. 2) Recover an RBS 给你一个括号序列,里面存在?号,题目保证至少有一种方案使得该括号序 ...
- vue全局事件总线
首先在main.js中app实例中使用生命周期钩子添加组件 new Vue({ router, render: h => h(App), beforeCreate() { Vue.prototy ...
- VLC web(http)控制 (3) 播放控制
VLC web(http) 播放控制: 1.如果已经在打开视频 播放和暂停都是:http://127.0.0.1:8080/requests/status.xml?command=pl_pause ...
- IOS实现水波纹
IOS实现水波纹 需要实现一个水波纹效果 其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动 具体实现 定义两个layer,用 ...
- blender low poly + unity 3d游戏制作
会是一个有趣的方向,适合独立游戏制作人,独立动画电影制作人.