python 垃圾回收机制
简介
在Python中,垃圾回收是自动管理内存的一个重要方面。Python使用了一种称为引用计数的策略来跟踪对象的引用数目。当对象的引用计数降为零时,Python解释器就会自动释放该对象所占用的内存空间。
除了引用计数之外,Python还使用了其他一些机制来处理循环引用等情况下的内存回收问题。其中最主要的是分代垃圾回收机制,它将对象分为不同的代,根据对象的存活时间来判断何时进行垃圾回收。Python将对象分为三代,一般情况下新创建的对象属于第一代,随着存活时间的增加,对象可能被转移到第二代或第三代。
Python的垃圾回收机制通过周期性地执行垃圾回收来释放不再使用的内存空间,这个过程是自动进行的,开发者无需手动干预。但是,了解垃圾回收的原理对于编写高效的Python代码以及避免内存泄漏等问题是非常有帮助的。
让我更详细地解释Python的垃圾回收机制。
-
引用计数:
- Python中的每个对象都有一个引用计数,用来跟踪有多少引用指向该对象。
- 当一个对象的引用计数减少到零时,意味着没有任何引用指向该对象,Python解释器会自动将其释放,并回收其所占用的内存空间。
- 引用计数的实现简单高效,可以迅速地处理对象的释放,但是无法解决循环引用的问题。
-
分代垃圾回收:
- 为了解决循环引用等问题,Python引入了分代垃圾回收机制。
- Python将对象分为三代:0代、1代和2代。新创建的对象属于0代,当对象经历了一次垃圾回收但仍然存活时,它将被提升到下一代。
- Python会根据每一代对象的存活时间来决定何时进行垃圾回收。一般情况下,0代对象的回收频率最高,而2代对象的回收频率最低。
-
标记清除算法:
- 分代垃圾回收的核心算法之一是标记清除算法。
- 这个算法首先会从根对象(如全局变量、当前调用栈等)出发,标记所有可以访问到的对象。
- 然后,将未标记的对象视为垃圾,进行清除和回收。
- 这个过程会遍历对象之间的引用关系,找出所有可达对象,而不会受到循环引用的影响。
-
内存池机制:
- Python还使用了内存池机制来管理小型对象的内存分配。这个机制可以减少内存碎片的产生,提高内存分配的效率。
- 内存池会在程序启动时预先分配一定数量的内存块,当需要分配小型对象时,直接从内存池中获取,而不是直接向操作系统请求内存。
Python的垃圾回收机制通过引用计数、分代回收和标记清除算法等方式,实现了自动管理内存的目标。这使得开发者可以专注于编写代码,而无需过多关注内存管理的细节。
案例
一个简单的案例来说明Python中的垃圾回收机制。我们将创建一些对象并模拟它们的引用关系,然后观察垃圾回收的行为。
import gcclass Person:def __init__(self, name):self.name = nameprint(f'{self.name} 被创建')def __del__(self):print(f'{self.name} 被销毁')# 创建对象
john = Person('John')
mary = Person('Mary')# 创建循环引用
john.friend = mary
mary.friend = john# 删除引用
del john
del mary# 显式触发垃圾回收
print("=== 显式触发垃圾回收 ===")
gc.collect()
在这个例子中,我们创建了两个Person对象(John和Mary),然后创建了一个循环引用,即John的朋友是Mary,而Mary的朋友又是John。接着,我们删除了对这两个对象的引用,并显式触发了垃圾回收。
当你运行这段代码时,你会看到如下输出:
John 被创建
Mary 被创建
=== 显式触发垃圾回收 ===
Mary 被销毁
John 被销毁
从输出可以看出,当我们删除了对John和Mary的引用并显式触发了垃圾回收后,它们被成功销毁了。这表明Python的垃圾回收机制成功地处理了循环引用的情况,确保了对象的正确释放和内存的回收。
gc.collect() 作用
gc.collect() 是 Python 中 gc(Garbage Collector)模块提供的一个函数,用于手动触发垃圾回收。垃圾回收机制通常是自动执行的,但有时你可能希望在特定时刻手动触发一次垃圾回收,以确保及时释放不再使用的内存空间。
当你调用 gc.collect() 时,Python 解释器会尝试回收所有可以释放的内存空间。这可能包括引用计数为零的对象,以及通过标记清除算法找到的未被引用的对象。这个过程并不保证一定会释放所有的垃圾对象,但会尽最大努力来释放尽可能多的内存空间。
在某些情况下,特别是在处理大量对象或长时间运行的程序时,手动调用 gc.collect() 可能有助于优化内存使用和性能。然而,过度频繁地调用垃圾回收可能会导致性能下降,因此需要谨慎使用。
相关文章:
python 垃圾回收机制
简介 在Python中,垃圾回收是自动管理内存的一个重要方面。Python使用了一种称为引用计数的策略来跟踪对象的引用数目。当对象的引用计数降为零时,Python解释器就会自动释放该对象所占用的内存空间。 除了引用计数之外,Python还使用了其他一…...
深度学习设计模式之组合模式
文章目录 前言一、介绍二、详细分析1.核心组成2.实现步骤3.代码示例4.优缺点优点缺点 5.使用场景 总结 前言 组合模式是将对象组合成树形结构来表现"整体/部分"层次结构,可以更好的实现管理操作。 一、介绍 组合设计模式又叫部分整体模式,将…...
C++ 网络编程
一、Reactor 网络编程模型 reactor 是一个事件处理模型。网络处理:因为用户层并不知道 IO 什么时候就绪,所以将对 IO 的处理转化为对事件的处理。网络模型构成: 非阻塞 IO:操作 IO,如果 IO 未就绪,IO 函数会立刻返回。IO 多路复用:检测多路 IO 是否就绪。工作流程: 注册…...
服务案例|网络攻击事件的排查与修复
LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警,Trap是一种主动推送网络设备事件或告警消息的方式,与SNMP轮询(polling)不同,具有以下几点优势: 1. 实时监控与快速响应 SNMP Trap能够实时…...
如何使用宝塔面板搭建Tipask问答社区网站并发布公网远程访问
文章目录 前言1.Tipask网站搭建1.1 Tipask网站下载和安装1.2 Tipask网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道(云端设置)2.3 Cpolar稳定隧道(本地设置) 3. 公网访问测试4.结语 前…...
Git学习和使用指南简单篇
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
HTTPS单双向认证流程详解与联想
HTTPS单向认证 HTTPS在单向认证传输的过程中会涉及到三个密钥: 服务端的公钥和私钥,用来进行非对称加密交换密钥 客户端生成的随机密钥,用来进行对称加密传输数据 认证过程 1.客户端向服务器发起HTTPS请求,连接到服务器的443端…...
防止浏览器缓存了静态的配置等文件(例如外部的config.js 等文件)
防止浏览器缓存了静态的配置文件 前言1、在script引入的时候添加随机数1.1、引入js文件1.2、引入css文件 2、通过html文件的<meta>设置防止缓存3、使用HTTP响应头: 前言 在实际开发中浏览器的缓存问题一直是一个很让人头疼的问题,尤其是我们打包时…...
【Umi】umi-max 中使用 Dva
前置介绍 Umi 是一个基于 React 的可插拔企业级前端应用框架,Umi 提供了一系列的插件和约定,使得开发者能够以约定大于配置的方式进行开发,同时还支持丰富的功能扩展和插件机制。 Dva 是一个基于 Redux、Redux-Saga 和 React-Router 的数据…...
Inno Setup 深入浅出-文件的显示
【1】在需要打包的文件中,新建一个文本文件,如License.txt 注意:中文的编码格式需要GB2312,否则显示乱码 【2】读取、显示文本 [Code] procedure Init_ShowLicense(); var tmpFont:TFont; begin editLicense : TMemo.C…...
数据链路层协议——以太网协议
目录 一、认识以太网 二、以太网帧格式 三、MTU 四、ARP协议 ARP协议 ARP协议格式 ARP缓存表 一、认识以太网 前面,我们讲到了网络层的IP协议,它通过目的IP,子网划分,路由表查找及其算法等方式让IP报文能够从一个主机到另一…...
一篇讲透数据结构之链式队列
目录 一.队列的定义 二.队列的分类 三.队列的功能 四.链式队列的声明 五.链式队列功能的实现 5.1 初始化队列 5.2 判断队列是否为空 5.3 获取队头元素 5.4 获取队尾元素 5.5获取队列长度 5.6 入队 5.7出队 5.8 打印队列元素 5.9 销毁队列 一.队列的定义 队列&…...
【408真题】2009-24
“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…...
6年IT找工作想法
由于我学历比较低,当时没好好学,后面参加了大数据培训,现在也已经有6年了。 我是计算机专业的,我的培训同学有些不是计算机的,但是是本科,双非一本的这种,在6年后和我的差距不是一点点了&#x…...
TOPSIS综合评价
TOPSIS法(Technique for Order Preference by Similarity to an Ideal Solution)是一种常用的综合评价方法,该方法根据有限个评价对象与理想化目标的接近程度进行排序,是在现有的对象中进行相对优劣的评价。 TOPSIS法的原理是通过…...
修改vuetify3的开关组件v-switch在inset模式下的大小
<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1:本页面使用 本页面中使用,必须要含有lang“scss” scoped,才会生效 <style lang"scss"…...
m1系列芯片aarch64架构使用docker-compose安装nacos
之前看到 DockerHub 上发布了 m1 芯片 aarch64 架构的 nacos 镜像, 所以就尝试的安装了下, 亲测可用: 一. docker-compose.yml 编写 请确保自己的 mysql 服务已经启动了, 并且允许远程连接 volumes 挂载目录需要换成自己的目录 二. 容器运行和网络组 2.1 查看容器运行情况 …...
优化耗时业务:异步线程在微服务中的应用
大家好,我是程序员大猩猩。 大家都知道,在我们实际开发过程中,我们经常会遇到一些耗时的业务和逻辑,比如说要上传什么大文件,又或者是大文件的数据处理。我们不能一个接口上等着这些耗时任务完成之后了,再…...
torch.scatter看图理解
torch.Tensor.scatter 有 4 个参数: scatter(dim, index, src, reduceNone) 先忽略 Reduce,最后再解释。先从最简单的开始。我们有一个 (2,4) 形状的张量,里面填充了 1: 粉红色的符号表示张量结构 并且我们传入相应的参数并得到…...
适合学生党的蓝牙耳机有哪些?盘点四大性价比蓝牙耳机品牌
对于追求高品质音乐体验而又预算有限的学生党来说,一款性价比高的蓝牙耳机无疑是最佳选择,在众多品牌和型号中,如何挑选到既适合自己需求又价格亲民的蓝牙耳机,确实是一个值得思考的问题,作为一个蓝牙耳机大户…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
