一、内存管理机制

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内存管理机制和垃圾回收机制的简单理解的更多相关文章

  1. JVM内存管理、JVM垃圾回收机制、新生代、老年代以及永久代

    内存模型 JVM运行时数据区由程序计数器.堆.虚拟机栈.本地方法栈.方法区部分组成,结构图如下所示. JVM内存结构由程序计数器.堆.栈.本地方法栈.方法区等部分组成,结构图如下所示: 1)程序计数器 ...

  2. Python内存管理方式和垃圾回收算法解析

    在列表,元组,实例,类,字典和函数中存在循环引用问题.有 __del__ 方法的实例会以健全的方式被处理.给新类型添加GC支持是很容易的.支持GC的Python与常规的Python是二进制兼容的. 分 ...

  3. JVM内存管理机制和垃圾回收机制

    JVM内存管理机制和垃圾回收机制 JVM结构 图片描述: java源码编译成class文件 class文件通过类加载器加载到内存 其中方法区存放的是运行时的常量.静态变量.类信息等,被所有线程共享 堆 ...

  4. JVM内存管理和JVM垃圾回收机制

    JVM内存管理和JVM垃圾回收机制(1) 这里向大家描述一下JVM学习笔记之JVM内存管理和JVM垃圾回收的概念,JVM内存结构由堆.栈.本地方法栈.方法区等部分组成,另外JVM分别对新生代和旧生代采 ...

  5. php内存管理机制与垃圾回收机制

    PHP内存管理机制 1 var_dump(memory_get_usage()); //获取内存 2 $a = "laruence"; //定义一个变量 3 var_dump(me ...

  6. php内存管理机制、垃圾回收机制

    一.内存管理机制 先看一段代码: <?php //内存管理机制 var_dump(memory_get_usage());//获取内存方法,加上true返回实际内存,不加则返回表现内存 $a = ...

  7. JVM的内存区域划分以及垃圾回收机制详解

    在我们写Java代码时,大部分情况下是不用关心你New的对象是否被释放掉,或者什么时候被释放掉.因为JVM中有垃圾自动回收机制.在之前的博客中我们聊过Objective-C中的MRC(手动引用计数)以 ...

  8. JS 从内存空间谈到垃圾回收机制

     壹 ❀ 引 从事计算机相关技术工作的同学,对于内存空间相关概念多少有所耳闻,毕竟像我这种非计算机科班出身的人,对于栈堆,垃圾回收都能简单说道几句:当我明白JS 基本类型与引用类型数据存储方式不同,才 ...

  9. Python程序运行流程与垃圾回收机制

    Python程序运行流程 Python解释器首先将程序将py文件编译成一个字节码对象PyCodeObject(只存在于内存中).(当这个模块的 Python 代码执行完后,就会将编译结果保存到了pyc ...

  10. python进阶(7)垃圾回收机制

    Python垃圾回收 基于C语言源码底层,让你真正了解垃圾回收机制的实现 引用计数器 标记清除 分代回收 缓存机制 Python的C源码(3.8.2版本) 1.引用计数器 1.1环状双向链表 refc ...

随机推荐

  1. vue-elementui中el-table跨页选择和v-if导致列错乱/选择框无法显示

    在vue-elementui中使用el-table,当type="selection"的时候,分页数据进行不同页跳转选择 需要这种功能的时候我们需要在el-table的标签上为每个 ...

  2. Solr的学习使用之(七)Solr高级查询facet、facet.pivot简介 - OnTheRoad_Lee

    http://martin3000.iteye.com/blog/1330106 1 .什么是Faceted Search Facet['fæsɪt]很难翻译,只能靠例子来理解了.Solr作者Yoni ...

  3. Avalonia UI 中 Styles 与 ControlTheme 的区别

    目录 目录 介绍 使用方式 全局主题 (Global Theme) 局部主题 (Local Theme) 控件主题 (ControlTheme) 问题描述 问题分析 问题1 区别 问题2 重写Temp ...

  4. python系统模块之re

    正则模块re: 元字符: 字符 描述 . 除换行符外的任意字符 \ 转义字符 [...] 字符集合,匹配任务其中一个 \d 数字:[0-9] \D 非数字:[^\d] \w 单词字符[A-Za-z0- ...

  5. Graylog之基本使用

    文档:https://docs.graylog.org/en/3.0/ Graylog Sidecar是一个轻量级配置管理系统,适用于不同的日志收集器,也称为后端.Graylog节点充当包含日志收集器 ...

  6. Educational Codeforces Round 132 (Rated for Div

    Educational Codeforces Round 132 (Rated for Div. 2) Recover an RBS 给你一个括号序列,里面存在?号,题目保证至少有一种方案使得该括号序 ...

  7. vue全局事件总线

    首先在main.js中app实例中使用生命周期钩子添加组件 new Vue({ router, render: h => h(App), beforeCreate() { Vue.prototy ...

  8. VLC web(http)控制 (3) 播放控制

    VLC  web(http) 播放控制: 1.如果已经在打开视频 播放和暂停都是:http://127.0.0.1:8080/requests/status.xml?command=pl_pause ...

  9. IOS实现水波纹

    IOS实现水波纹 需要实现一个水波纹效果 其实就是画两个正弦函数或者余弦函数的layer在view上面,根据屏幕刷新率来重绘,更新其左右偏移量来让其看起来是在左右移动 具体实现 定义两个layer,用 ...

  10. blender low poly + unity 3d游戏制作

    会是一个有趣的方向,适合独立游戏制作人,独立动画电影制作人.