Python开发运维:Python垃圾回收机制
目录
一、理论
1.Python垃圾回收机制
一、理论
1.Python垃圾回收机制
(1)引⽤计数器
1)环状双向链表 refchain
在python程序中创建的任何对象都会放在refchain链表中。
name = "david"
age = 20
hobby = ["篮球",'游泳']
内部会创建⼀些数据【 上⼀个对象、下⼀个对象、类型、引⽤个数 】
name = "david"
new = name内部会创建⼀些数据【 上⼀个对象、下⼀个对象、类型、引⽤个数、val=18】
age = 20内部会创建⼀些数据【 上⼀个对象、下⼀个对象、类型、引⽤个数、items=元素、元素个数 】
hobby = ["篮球",'游泳']
在C源码中如何体现每个对象中都有的相同的值:PyObject结构体(4个值)。
有多个元素组成的对象:PyObject结构体(4个值) + ob_size 。
2)类型封装结构体
data = 3.14内部会创建:_ob_next = refchain中的上⼀个对象_ob_prev = refchain中的下⼀个对象ob_refcnt = 1ob_type = floatob_fval = 3.14
3)引⽤计数器
v1 = 3.14
v2 = 999
v3 = (1,2,3)
当python程序运⾏时,会根据数据类型的不同找到其对应的结构体,根据结构体中的字段来进⾏创建相 关的数据,然后将对象添加到refchain双线链表中。 在C源码中有两个关键的结构体:PyObject、PyVarObject。 每个对象中有 ob_refcnt就是引⽤计数器,值默认为 1 ,当有其他变量引⽤对象时,引⽤计数器就会发 ⽣变化。
#引⽤
a = 777
b = a#删除引⽤
a = 777
b = a
del b # b变量删除;b对应对象引⽤计数器-1
del a # a变量删除;a对应对象引⽤计数器-1
# 当⼀个对象的引⽤计数器为0时,意味着没有⼈再使⽤这个对象了,这个对象就是垃圾,垃圾回收。
# 回收:1.对象从refchain链表移除;2.将对象销毁,内存归还。
4)循环引⽤问题
v1 = [11,22,33] #refchain中创建一个列表对象,由于v1=对象,所以列表引用对象计数器为1
v2 = [44,55,66] #refchain中创建一个列表对象,由于v2=对象,所以列表引用对象计数器为1
v1.append(v2) #把v2追加到v1中,则v2对应的[44,55,66]对象的引用计数器增加1,最终为2
v2.append(v1) #把v1追加到v2中,则v1对应的[11,22,33]对象的引用计数器增加1,最终为2del v1 #引用计数器-1
del v2 #引用计数器-1

(2)标记清除
⽬的:为了解决引⽤计数器循环引⽤的不⾜。
实现:在python的底层再维护⼀个链表,链表中专⻔放那些可能存在循环引⽤的对象
(list/tuple/dict/set)。

在Python内部 某种情况 下触发,回去扫描 可能存在循环应⽤的链表 中的每个元素,检查是否有循环引⽤,如果有则让双⽅的引⽤计数器 -1 ;如果是0则垃圾回收。
(3)分代回收
将可能存在循环应⽤的对象维护成3个链表:
0代:0代中对象个数达到700个扫描⼀次。
1代:0代扫描10次,则1代扫描⼀次。
2代:1代扫描10次,则2代扫描⼀次。

(4) 总结
在python中维护了⼀个refchain的双向环状链表,这个链表中存储程序创建的所有对象,每种类型的对
象中都有⼀个ob_refcnt引⽤计数器的值,引⽤个数 + 1、-1 ,最后当引⽤计数器变为0时会进⾏垃圾回
收(对象销毁、refchain中移除)。但是,在python中对于那些可以有多个元素组成的对象可能会存在循环引⽤的问题,为了解决这个问题
python⼜引⼊了标记清除和分代回收,在其内部为了4个链表,
refchain
2代,10⼨
1代,10次
0代,700个在源码内部当达到各⾃的阈值时,就会触发扫描链表进⾏标记清除的动作(有循环则各⾃-1)。
相关文章:
Python开发运维:Python垃圾回收机制
目录 一、理论 1.Python垃圾回收机制 一、理论 1.Python垃圾回收机制 (1)引⽤计数器 1)环状双向链表 refchain 在python程序中创建的任何对象都会放在refchain链表中。 name "david" age 20 hobby ["篮球",游泳…...
ros2/ros安装ros-dep||rosdep init错误
第一个错误的做法: sudo apt-get install python3-pip sudo pip3 install 6-rosdep sudo 6-rosdep 如果使用上述代码将会摧毁整个系统,不重装系统反正我是搞不定啊,因为我不知道那个写软件的人到底做了什么。因为这个我安装的版本是humble&…...
《深入理解计算机系统》学习笔记 - 第四课 - 机器级别的程序
Lecture 05 Machine Level Programming I Basics 机器级别的程序 文章目录 Lecture 05 Machine Level Programming I Basics 机器级别的程序intel 处理器的历史和体系结构芯片的构成AMD 公司(Advanced Micro Devices,先进的微型设备) C, 汇编, 机器代码定义汇编/机器…...
云原生(Cloud Native)——概念,技术,背景,优缺点,实践例子
云原生(Cloud Native)是一种构建和运行应用程序的方法,这些应用程序充分利用云计算的优势。云原生应用程序通常设计为在现代、动态的环境中运行,如公共云、私有云和混合云。这种方法强调微服务架构、容器化、自动化、易于管理和可…...
ElasticSearch之线程池
ElasticSearch节点可用的CPU核的数量,通常可以交给ElasticSearch来自行检测和判定,另外可以在elasticsearch.yml中显式指定。样例如下: node.processors: 2如下表格中的processors即CPU核的数量。 线程池的列表 线程池名称类型线程数量队列…...
StoneDB-8.0-V2.2.0 企业版正式发布!性能优化,稳定性提升,持续公测中!
11月,StoneDB 新版本如期而至,这一个月来我们的研发同学加班加点,持续迭代:在 2.2.0 版本中,我们针对用户提出的需求和做出了重量级更新,修复了一些已知和用户反馈的 Bug,同时对部分代码进行…...
【数据结构 — 排序 — 插入排序】
数据结构 — 排序 — 插入排序 一.排序1.1.排序的概念及其运用1.1.1排序的概念1.1.2排序运用1.1.3 常见的排序算法 二.插入排序2.1.直接插入排序2.1.1.算法讲解2.1.2.代码实现2.1.2.1.函数定义2.1.2.2.算法接口实现2.1.2.3.测试代码实现2.1.2.4.测试展示 2.2.希尔排序2.2.1.算法…...
物联网后端个人第十四周总结
物联网方面进度 1.登陆超时是因为后端运行的端口和前端监听的接口不一样,所以后端也没有报错,将二者修改一致即可 2.登录之后会进行平台的初始化,但是初始化的时候会卡住,此时只需要将路径的IP端口后边的内容去掉即可 3.阅读并完成了jetlinks…...
在uniapp中,可以使用那些预定义的样式类
u-flex:设置元素为弹性布局。u-flex-v:设置元素为纵向弹性布局。u-flex-h:设置元素为横向弹性布局。u-p-10:设置元素的上下左右边距为10rpx。u-p-t-10:设置元素的上边距为10rpx。u-p-b-10:设置元素的下边距…...
mybatis的数据库连接池
直接看原文 原文链接:【MyBatis】 连接池技术_mybatis自带连接池-CSDN博客 本文先不说springBoot整合mybatis后的 本文讲的是没有被springBoot整合前的mybatis自己的默认的连接池 --------------------------------------------------------------------------------------…...
Vue 的 el-select 下拉选项中,只有当文字超出时才显示提示框,未超出的则不显示
Vue 的 el-select 下拉选项中,只有当文字超出时才显示提示框,未超出的则不显示 <template><div><el-select v-model"selected" placeholder"请选择"><el-optionv-for"item in options":key"it…...
【Python】pptx文件转pdf
要将PPTX文件转换为PDF格式,你可以使用Python的python-pptx库来读取PPTX文件,然后使用comtypes库在Windows上或unoconv在Linux上来进行转换。但是,需要注意的是,comtypes依赖于Microsoft Office,而unoconv依赖于LibreO…...
response应用及重定向和request转发
请求和转发: response说明一、response文件下载二、response验证码实现1.前置知识:2.具体实现:3.知识总结 三、response重定向四、request转发五、重定向和转发的区别 response说明 response是指HttpServletResponse,该响应有很多的应用&…...
CentOS常用基础命令大全(linux命令)2
CentOS常用基础命令大全(linux命令) 1.关机 (系统的关机、重启以及登出 ) 的命令 shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 shutdown -c 取消按预定时间关闭系统 sh…...
分析阿里巴巴的微服务依赖图和性能
论文对阿里巴巴集群中部署的大规模微服务进行了全面的研究。他们分析了 7 天内 20,000 多个微服务的行为,并根据收集的 100 亿条调用跟踪来分析它们的特征。该论文获得SOCC 2021最佳论文奖。 他们发现: 微服务图在运行时是动态的 大多数图形像树一样分…...
Linux——基本指令(一)
写在前面: 我们云服务器搭建的Linux系统,使用的镜像版本CentOS 7.6,使用的Xshell远程连接云服务器 前面我们使用超级管理员root账号登录,一般我们使用普通用户登录,那么如何创建新用户呢? 1.创建新用户 (…...
虚幻学习笔记10—C++函数与蓝图的通信
一、前言 除了上一章C变量与蓝图通信讲的变量能与蓝图通信外,还有函数和枚举也可以和蓝图通信。函数的关键字为”UFUNCTION“、枚举的关键字为”UENUM“。 二、实现 2.1、BlueprintCallable蓝图中调用 该函数时带执行的,带入如下。编译成功后在蓝图中输…...
无重复字符的最长子串(LeetCode 3)
文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:暴力法方法二:滑动窗口 参考文献 1.问题描述 给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。 s 由英文字母、数字、符号和空格组成。 示例 1: 输…...
交付《啤酒游戏经营决策沙盘》的项目
感谢首富客户连续两年的邀请,交付《啤酒游戏经营决策沙盘》的项目,下周一JSTO首席学习官Luna想让我分享下系统思考与投资理财,想到曾经看过的一本书《深度思维》,看到一些结构来预判未来。不仅仅可以应用在企业经营和组织发展上&a…...
油猴(Tampermonkey)浏览器插件简单自定义脚本开发
介绍 浏览器插件,包括油猴插件和其他插件,通过它们可以实现浏览器网页的定制化与功能增强。 其他插件一般只有某种具体的功能,且已经写死而不能更改,比如Adblock插件只用于去广告。 油猴插件是一款用于管理用户脚本的插件&…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
