内存管理机制

python是由c开发出来的。
看源码分析,下载python安装包tar包
解压后主要看Include和Objects这两个文件夹 # 分析
在创建对象时,如 v = 0.3
源码内部:
a. 开辟内存
b. 初始化
ob_fval=0.3
ob_type=float #类型
ob_refcnt=1 #计数器
c.将对象加入到双向联表中 ref_chain
操作:
name = v # 将name也指向v的内存地址,不会重新开辟空间
源码内部:
ob_refcnt+1 #计数器加1 操作:
del v
源码内部:
ob_refcnt-1 #计数器-1 操作:
def fun(arg):
print(123)
fun(name)
源码内部:
刚进去的时候ob_refcnt+1 # 计数器+1
运行结束的时候ob_refcnt-1 #计数器-1 操作:
del name
源码内部:
ob_refcnt-1 #计数器-1
每次应用计数器减一时,都会检查是否以为0,如果是0,则认为它是垃圾,就回对它进行回收 # 缓存机制
python内部为了提升效率,会做一些缓存机制
比如:
v = 0.3
name = v
del v
id(name) # 66217
del name
xx = 66.66
id(xx) # 66217
按理说当name和v都被删除后,应该会销毁,但是并没有,这里主要是因为缓存的机制
所以xx的内存地址会跟name的内存地址一致。 # 总结
# 内存管理机制
python是由c语言开发,操作都是基于底层c语言实现,python中创建每个对象,内部都会与c语言结构体维护一些值,PyObject(双向链表,引用计数器,类型)和PyVarObject(PyObject,容量个数),在创建对象时,每个对象至少内部有4个值(双向链表,引用计数器,类型),创建对象之后会对内存中的数据进行初始化,初始化本质:引用计数器=1,赋值,然后将对象添加到双向链表中refchain.以后再有其它变量指向这个内存,则让引用计数器+1,如果销毁某个变量,则找到它指向的内存,将其引用计数器-1.引用计数器如果为0,则进行垃圾回收。
在内部可能存在缓存机制,例如:float(100)/int(257)/list(80), 最开始时不会真正销毁,而是放在free_list的链表中,以后再创建同类型的的数据时,会先去链表中取出对象,然后再对对象初始化。 # 垃圾回收机制
引用计数器为主,标记清除和分代回收为辅。
引用计数器会出现循环引用(容器类会出现)
标记清除:针对那些容器类的对象,在python中会将他们单独放到一个双项链表中,做定期扫描,检查是否有循环引用,如果有则各自-1,如果-1之后等于0,则直接回收。
分代回收:为了少扫描对象,将没有问题的对象让它放到上一级的链表中,默认下一级扫10次,上一代才扫描1次,总共有3代。

内存管理机制 & 垃圾回收机制的更多相关文章

  1. JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)

    转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...

  2. JVM内存管理和垃圾回收机制介绍

    http://backend.blog.163.com/blog/static/20229412620128233285220/     内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...

  3. V8 内存管理和垃圾回收机制总结

    这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...

  4. JVM的生命周期、体系结构、内存管理和垃圾回收机制

    一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...

  5. java基础(一):谈谈java内存管理与垃圾回收机制

    看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...

  6. JavaScript 执行环境、作用域、内存管理及垃圾回收机制

    前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...

  7. python的内存管理与垃圾回收机制学习

    一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对 ...

  8. 【第1题】 Pythonn内存管理以及垃圾回收机制

    内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...

  9. PHP 内存管理及垃圾回收机制

    PHP5的内存管理 对象传递 PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval). ...

  10. Python的内存管理和垃圾回收机制

    内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...

随机推荐

  1. 【转帖】纳尼,mysqldump导出的数据居然少了40万?

    0.导读 用mysqldump备份数据时,加上 -w 条件选项过滤部分数据,发现导出结果比实际少了40万,什么情况? 本文约1500字,阅读时间约5分钟. 1.问题 我的朋友小文前几天遇到一个怪事,他 ...

  2. [转帖]vCenter使用 VMCA 续订证书:续订证书时发生意外错误

    https://www.dinghui.org/vcenter-sts-certificate.html 起因:有一处客户vCenter告警:STS签名证书即将过期. 处理办法:系统管理-证书-证书管 ...

  3. [转帖]细说Redis监控和告警

    https://blog.csdn.net/sD7O95O/article/details/78096956 对于任何应用服务和组件,都需要一套完善可靠谱监控方案.尤其redis这类敏感的纯内存.高并 ...

  4. [转帖]文件系统读写性能fio测试方法及参数详解

    简介 Fio 是一个 I/O 工具,用来对硬件进行压力测试和验证,磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类. Fio支持13种不同的I/O引擎,包括:sync, ...

  5. [转帖]02-rsync备份方式

    https://developer.aliyun.com/article/885789?spm=a2c6h.24874632.expert-profile.283.7c46cfe9h5DxWK 简介: ...

  6. Linux应用程序下网络栈参数的简单整理

    somaxconn 该参数应该是决定一个服务能够同时处理多少个网络请求的核心参数. 一个程序能够支持多少个访问参数,是有两部分来决定, 第一部分是somaxconn ,第二部分是应用服务器启动时传递过 ...

  7. XJTU少年班+自动化钱学森班+电气工程辅修专业课笔记合集

    通过百度网盘分享的文件:笔记整理链接:https://pan.baidu.com/s/1BrHQ1EqvlQlbWqpD5h_6Sg?pwd=shsg 提取码:shsg复制这段内容打开「百度网盘APP ...

  8. Bitmap、RoaringBitmap原理分析

    作者:京东科技 曹留界 在人群本地化实践中我们介绍了人群ID中所有的pin的偏移量可以通过Bitmap存储,而Bitmap所占用的空间大小只与偏移量的最大值有关系.假如现在要向Bitmap内存入两个p ...

  9. easyUI 多表头设置

  10. svn忽略某个目录后update出现fetching

    忽略某个子目录 在svn udpate一个大目录时忽略特定的子目录,主要是子目录下内容已经单独拉取过,并且这个大目录对于程序来说,可以是只读的. 操作方法:选中要忽略的目录,右键 svn - Unve ...