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)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/214102.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ultimate VFX

Ultimate VFX 构建套件:

C.小苯的排列构造

C-小苯的排列构造_北京信息科技大学第十五届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 凑2很容易想出来&#xff0c;但是2 4 1 3 这个内核不好想&#xff0c;算是一种尝试和经验吧 #include<bits/stdc.h> using namespace std;int n;int main() {cin&g…

使用RSA工具进行对信息加解密

我们在开发中需要对用户敏感数据进行加解密&#xff0c;比如密码 这边科普一下RSA算法 RSA是非对称加密算法&#xff0c;与对称加密算法不同;在对称加密中&#xff0c;相同的密钥用于加密和解密数据,因此密钥的安全性至关重要;而在RSA非对称加密中&#xff0c;有两个密钥&…

P11 Linux进程编程exec族函数

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《链表_C…

蓝桥杯物联网竞赛_STM32L071_8_ADC扩展模块

原理图&#xff1a; 扩展模块原理图&#xff1a; RP1和RP2分别对应着AIN1和AIN2&#xff0c;扭动它们&#xff0c;其对应滑动变阻器阻值也会变化 实验板接口原理图&#xff1a; 对应实验板接口PB1和PB0 即AN1对应PB1, AN2对应PB0 CubMx配置&#xff1a; ADC通道IN8和IN9才对…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

Git的安装以及SSH配置

前言 近期工作需要&#xff0c;所以版本管理工具要用到Git&#xff0c;某些操作需要ssh进行操作&#xff0c;在某次操作中遇到&#xff1a;git bash报错&#xff1a;Permission denied, please try again。经排查是ssh没有配置我的key&#xff0c;所以就借着这篇文章整理了一下…

2024年网络安全竞赛-Web安全应用

Web安全应用 (一)拓扑图 任务环境说明: 1.获取PHP的版本号作为Flag值提交;(例如:5.2.14) 2.获取MySQL数据库的版本号作为Flag值提交;(例如:5.0.22) 3.获取系统的内核版本号作为Flag值提交;(例如:2.6.18) 4.获取网站后台管理员admin用户的密码作为Flag值提交…

redis 三主三从高可用集群docker swarm

由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作用是提供在多个Redis节点间共享数据的程序集。 官网介绍地址 re…

根据java类名找出当前是哪个Excel中的sheet

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

使用粗糙贴图制作粗纹皮革手提包3D模型

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时&#xff0c;有几种不同的风格&#xf…

react新旧生命周期钩子

以下的内容根据尚硅谷整理。 旧生命钩子 辅助理解&#xff1a; 红色框&#xff1a;挂载时生命钩子蓝色框&#xff1a;更新时生命钩子绿色框&#xff1a;卸载时生命钩子 挂载时 如图所示&#xff0c;我们可以看到&#xff0c;在组件第一次挂载时会经历&#xff1a; 构造器&a…

学习记录---kubernetes动态卷使用---storageClass及驱动安装(nfs驱动)

一、简介 kubernetes中&#xff0c;在存储层面&#xff0c;我们常用到的两个资源是pv和pvc&#xff0c;其中pv是实际创建出来的一致性卷&#xff0c;我们可以通过pv将容器中的数据进行持久化保存&#xff0c;而pvc则可以理解为pod使用pv的中间控制器&#xff0c;通过pvc将pv绑…

自然语言处理第2天:自然语言处理词语编码

​ ☁️主页 Nowl &#x1f525;专栏 《自然语言处理》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 一、自然语言处理介绍二、常见的词编码方式1.one-hot介绍缺点 2.词嵌入介绍说明 三、代码演示四、结语 一、自然语言处理介绍 自然语言处理&#xf…

vue2-使用vue-i18n搭建多语言切换环境

安装 注意&#xff1a;vue2.0要用8版本的&#xff0c;使用9版本的会报错 npm install vue-i18n8.27.0 --save 创建相关的语言包文件 在src目录下&#xff0c;新建i18n文件夹 在新文件夹i18n中新建langs文件夹&#xff0c;里边放语言文本文件.js zh.js&#xff1a;存…

C#网络应用程序(Web页面浏览器、局域网聊天程序)

目录 一、创建Web页面浏览器 1.示例源码 2.生成效果 二、局域网聊天程序 1.类 2.服务器端 3.客户端 一、创建Web页面浏览器 TextBox 控件用来输入要浏览的网页地址&#xff0c;Button控件用来执行浏览网页操作&#xff0c; WebBrowser控件用来显示要浏览的网页。这个控…

本项目基于Spring boot的AMQP模块,整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ

在业务逻辑的异步处理&#xff0c;系统解耦&#xff0c;分布式通信以及控制高并发的场景下&#xff0c;消息队列有着广泛的应用。本项目基于Spring的AMQP模块&#xff0c;整合流行的开源消息队列中间件rabbitMQ,实现一个向rabbitMQ添加和读取消息的功能。并比较了两种模式&…

Linux-centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器&#xff1f; 1 NFS基础了解 NFS&#xff08;Network File System&#xff09;即文件操作系统&#xff1b;NFS允许网络中不同计算机相互之间共享资源。 1.1 NFS概述 1980年由SUN发展出来的在UNIX&Linux系统间实现文件共享的一种方法…

键盘打字盲打练习系列之反复练习——3

一.欢迎来到我的酒馆 盲打&#xff0c;反复练习&#xff01; 目录 一.欢迎来到我的酒馆二.数字&符号键位指法1.数字键位指法2.符号键位指法 三.反复练习 二.数字&符号键位指法 前面的一个章节重点介绍了主键盘区字母键位的指法&#xff1a;基准键位指法、" QWERTY…

计算机基础知识65

cookie和session的使用 # 概念&#xff1a;cookie 是客户端浏览器上的键值对 # 目的&#xff1a;为了做会话保持 # 来源&#xff1a;服务端写入的&#xff0c;服务端再返回的响应头中写入&#xff0c;浏览器会自动取出来 存起来是以key value 形式&#xff0c;有过期时间、path…