内存管理机制 & 垃圾回收机制
内存管理机制
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代。
内存管理机制 & 垃圾回收机制的更多相关文章
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...
- JVM内存管理和垃圾回收机制介绍
http://backend.blog.163.com/blog/static/20229412620128233285220/ 内存管理和垃圾回收机制是JVM最核心的两个组成部分,对其内部实 ...
- V8 内存管理和垃圾回收机制总结
这篇文章主要介绍 V8 的内存管理和垃圾回收知识. V8 内存管理及垃圾回收机制浅析 由于 V8 引擎的原因,Node 在操作大内存对象时受到了一些限制,在 64 位的机器上,默认最大操作的对象大小约 ...
- JVM的生命周期、体系结构、内存管理和垃圾回收机制
一.JVM的生命周期 JVM实例:一个独立运行的java程序,是进程级别 JVM执行引擎:用户运行程序的线程,是JVM实例的一部分 JVM实例的诞生 当启动一个java程序时.一个JVM实例就诞生了, ...
- java基础(一):谈谈java内存管理与垃圾回收机制
看了很多java内存管理的文章或者博客,写的要么笼统,要么划分的不正确,且很多文章都千篇一律.例如部分地方将jvm笼统的分为堆.栈.程序计数器,这么分太过于笼统,无法清晰的阐述java的内存管理模型: ...
- JavaScript 执行环境、作用域、内存管理及垃圾回收机制
前言 JavaScript具有自动垃圾收集机制,也就是说,执行环境会负责管理代码执行过程中使用的内存. [原理]找出那些不再继续使用的变量,然后释放其占用的内存.为此,垃圾收集器会按照固定的时间间隔( ...
- python的内存管理与垃圾回收机制学习
一.python内存申请: 1.python的内存管理分为六层:最底的两层有OS控制.第三层是调用C的malloc和free等进行内存控制.第四层第五层是python的内存池.最上层使我们接触的直接对 ...
- 【第1题】 Pythonn内存管理以及垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
- PHP 内存管理及垃圾回收机制
PHP5的内存管理 对象传递 PHP5使用了Zend引擎II,对象被储存于独立的结构Object Store中,而不像其它一般变量那样储存于Zval中(在PHP4中对象和一般变量一样存储于Zval). ...
- Python的内存管理和垃圾回收机制
内存管理 Python解释器由c语言开发完成,py中所有的操作最终都由底层的c语言来实现并完成,所以想要了解底层内存管理需要结合python源码来进行解释. 1. 两个重要的结构体 include/o ...
随机推荐
- 【转帖】数据库篇-MySql架构介绍
https://zhuanlan.zhihu.com/p/147161770 公众号-坚持原创,码字不易.加微信 : touzinv 关注分享,手有余香~ 本篇咱们也来聊聊mysql物理和逻辑架构,还 ...
- Java火焰图简单学习
前言 立的flags倒了太多次 自己还是太菜了.. 课题太大, 自己简单总结一下. 要是自己总结错了. 就不收费, 错就错了 !-_-! 第一步准备环境 一定要设置对java的HOME以及PATH路径 ...
- element-ui中Select 选择器value-key的使用
场景描述 很多时候我们都需要使用下拉框 Select 选择器. 在获取值的时候,通常只需要传递对应的id给后端就行了. 但是特殊情况,后端不想去查库,不仅需要我们id,还有name,code之类的. ...
- 🛠 开源即时通讯(IM)项目OpenIM源码部署指南
OpenIM的部署涉及多个组件,并支持多种方式,包括源码.Docker和Kubernetes等.这要求在确保不同部署方式之间的兼容性同时,还需有效管理各版本之间的差异.确实,这些都是复杂的问题,涉及到 ...
- Git的使用(二):远程仓库
在github上创建远程仓库 本地创建Git仓库适合自己一个人完成工程,但是实际情况中我们需要其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份.常用的远程仓库就是g ...
- springboot多模块打包报错问题根因分析:Unable to find main class
问题背景: 项目结构为springboot多模块,其中有四个模块bean.utils.user.ems,其中user和ems模块为主程序,包含启动类,其他两个模块为其服务,提供依赖 问题分析: 查看u ...
- errgroup的常见误用
errgroup想必稍有经验的golang程序员都应该听说过,实际项目中用过的也应该不在少数.它和sync.WaitGroup类似,都可以发起执行并等待一组协程直到所有协程运行结束.除此之外errgr ...
- C/C++ Npcap包实现ARP欺骗
npcap 是Nmap自带的一个数据包处理工具,Nmap底层就是使用这个包进行收发包的,该库,是可以进行二次开发的,不过使用C语言开发费劲,在进行渗透任务时,还是使用Python构建数据包高效,唯一的 ...
- uniapp面试题
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- 神经网络优化篇:详解如何训练一个 Softmax 分类器(Training a Softmax classifier)
如何训练一个 Softmax 分类器 回忆一下之前举的的例子,输出层计算出的\(z^{[l]}\)如下,\(z^{[l]} = \begin{bmatrix} 5 \\ 2 \\ - 1 \\ 3 \ ...