python垃圾回收机制

Python垃圾回收机制 阅读详情

Python垃圾回收机制详解

Python的垃圾回收(Garbage Collection, GC)机制负责自动管理内存,无需程序员手动分配和释放内存。它通过多种策略结合工作,确保内存使用高效且安全。

1、引用计数:引用计数变为零时,清除对象
2、标记-清除:标记不可达的对象,然后清除
3、分代回收:优先回收0代对象,这样减少垃圾回收时间

一、核心机制

1. 引用计数(Reference Counting)
  • 原理:每个对象维护一个引用计数器,记录有多少变量引用该对象。
  • 增加引用:赋值、作为参数传递、存入容器等。
  • 减少引用:变量被赋值其他对象、对象被删除、容器被销毁等。
  • 回收条件:当引用计数为0时,对象立即被回收。

示例:

a = [1, 2, 3]  # 列表对象引用计数+1
b = a          # 引用计数+1
del a          # 引用计数-1
b = None       # 引用计数-1,对象被回收
优点
  • 实时性:引用计数为0时立即回收,高效且内存占用低。
  • 简单直观:实现逻辑清晰,易于理解。
缺点
  • 循环引用问题:当两个或多个对象互相引用时,引用计数永远不为0,导致内存泄漏。
a = []
b = []
a.append(b)  # a引用b
b.append(a)  # b引用a
del a, b     # 对象不会被回收(循环引用)

二、分代回收(Generational GC)

为解决循环引用问题,Python引入了分代回收机制,基于“弱代假说”(年轻对象更容易死亡):

1. 三代分类
  • 第0代:新创建的对象。
  • 第1代:经过一次垃圾回收后存活的对象。
  • 第2代:经过多次垃圾回收后存活的对象。
2. 触发条件
  • 每个代有独立的计数器,记录对象分配和删除次数。
  • 当计数器超过阈值时,触发对应代的垃圾回收。
  • 回收时会检查并处理循环引用的对象。
3. 对象移动
  • 存活的对象会被移至下一代(0 → 1 → 2)。
  • 第2代对象触发回收时,所有代都会被检查。

三、标记-清除(Mark and Sweep)

用于处理循环引用问题:

  1. 标记阶段

    • 从根对象(如全局变量、栈中的变量)出发,遍历所有可达对象并标记。
    • 不可达但存在循环引用的对象未被标记。
  2. 清除阶段

    • 回收所有未被标记的对象,即使它们的引用计数不为0。

四、缓存机制

为避免频繁创建和销毁对象,Python引入了对象缓存:

  1. 小整数池:缓存范围为[-5, 256]的整数。
a = 100
b = 100
print(a is b)  # True(同一对象)
  1. 字符串驻留:短字符串(通常长度≤20且只包含ASCII字母、数字或下划线)会被缓存。
a = "hello"
b = "hello"
print(a is b)  # True
  1. free_list:对某些对象(如列表、字典)进行复用,避免频繁内存分配。

五、手动控制垃圾回收

可通过 gc 模块手动干预垃圾回收:

import gc

# 启用/禁用自动垃圾回收
gc.enable()
gc.disable()

# 手动触发回收
gc.collect()

# 获取当前统计信息
counts = gc.get_count()  # 返回 (generation0_count, generation1_count, generation2_count)
thresholds = gc.get_threshold()  # 返回 (threshold0, threshold1, threshold2)

六、性能优化建议

  1. 减少循环引用
    避免对象间的双向引用,使用弱引用(weakref 模块)替代强引用。

  2. 调整回收阈值
    对于特定场景,可通过 gc.set_threshold() 调整回收频率。

  3. 避免频繁创建临时对象
    复用对象或使用生成器减少内存压力。

  4. 监控内存使用
    使用 memory_profiler、objgraph 等工具分析内存泄漏。

七、与其他语言的对比

语言垃圾回收机制特点
Python引用计数 + 分代回收实时性高,需处理循环引用
Java分代回收 + 标记-清除/复制吞吐量高,停顿时间较长
Go三色标记-清除并发回收,低延迟

总结

Python的垃圾回收机制通过引用计数和分代回收相结合,高效处理大部分内存管理场景。虽然存在循环引用的潜在问题,但通过标记-清除算法和手动干预,可有效避免内存泄漏。理解其工作原理有助于编写更高效、更安全的Python代码。

详解python中的垃圾回收机制 垃圾回收(Garbage Collection)是一种自动内存管理机制,用于检测和释放不再被程序使用的内存资源,以避免内存泄漏和资源浪费。在编程中,当对象被创建时,系统为其分配一块内存空间。但是,当对象不再被程序使用时,如果没有及时释放相关的内存空间,就会导致内存泄漏。垃圾回收机制的作用就是自动监测并释放这些无用的内存空间,以便重新分配给其他需要的对象。Python的垃圾回收机制采用引用计数和标记-清除两种策略相结合的方式,根据对象的引用计数来追踪对象的内存使用情况,并通过标记-清除算法处理循环引用问题。 阅读详情

相关推荐

Python教程:深入了解Python垃圾回收机制

在Python中,垃圾回收(Garbage Collection)是一种自动管理内存的机制,它可以自动识别和清理不再使用的对象,释放它们占用的内存空间,以提高内存利用率和程序性能。

旦莫的博客 2131

Python垃圾回收机制详解

我们从三个方面来了解一下Python的垃圾回收机制。一、引用计数   Python垃圾回收主要以引用计数为主,分代回收为辅。引用计数法的原理是每个对象维护一个ob_ref,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象,当发生以下四种情况的时候,该对象的引用计数器+1  与上述情况相对应,当发生以下四种情况时,该对象的引用计数器-1下面来补充一下它的源码分析: Python里面每一个东西都是对象,他们的核心是一个结构体Py_Object,所有Python对象的头部包含了这样一个结构P

2301_76965813的博客 4791

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决

【iOS开发】dyld: Symbol not found: ___chkstk_darwin 问题解决 Xcode 13.2.1 运行到iOS12.x版本上崩溃报错如下:dyld: Symbol not found: ___chkstk_darwin dyld: Symbol not found: ___chkstk_darwin Referenced from: /private/var/containers/Bundle/Application/A424CEFD-51DB-450E-9D62-B8

wm9028的专栏 6563

啥是Python的垃圾回收机制

说明python的垃圾回收机制

vincar的博客 265

opencv图像去畸变

opencv图像去畸变

智能机器人产学研基地 4868

Buck-Boost电路

前面我们学习了降压的Buck电路 (左图) 和升压的Boost电路 (右图),那么如果我们把Buck电路和Boost电路结合一下会发生什么情况? 我们尝试着画一下: 我们用Buck电路作为输入,然后用Boost电路进行调整,最后输出。因此Buck电路中的负载、Boost电路的电源都可以删掉。得到下图: 由于Buck电路中的C2的作用是在输出的时候滤波,这个功能已经由Boost电路中的C1实现了,因此可以删除Buck电路中的C2电容。得到下图: 这里两个电感处于串联状态,可以合二为一,得到下面的电路:

wangeil007的博客 4万+

【Python中的垃圾回收机制是什么】

Python的垃圾回收机制以引用计数为主,标记-清除和分代回收为辅。这种机制允许Python开发者专注于编写代码,无需手动管理内存资源,实现了自动化的内存管理。然而,垃圾回收并不是完美无缺的,它也需要消耗系统资源和执行时间,因此在实际应用中需要根据程序的特点和需求进行综合考虑。

qq_36253366的博客 704

STM32独立实现CANOpen主机功能:从零构建轻量级控制方案

本文详细介绍了如何在STM32上不依赖CanFestival库,从零构建一个轻量级的CANOpen主机方案。文章深入剖析了CANOpen主机的三大核心功能——NMT网络管理、SDO参数配置与PDO过程数据交换,并提供了从硬件准备、驱动层构建到协议实现的完整代码实战。该方案代码精简,资源占用低,特别适合在资源受限的STM32平台上实现工业控制、电机驱动等场景的稳定通信。

potato的博客 1072

Python 垃圾回收机制深度解析

fill:#333;color:#333;color:#333;fill:none;存活超过阈值存活超过阈值程序结束回收失败回收失败回收失败新对象创建第0代对象第1代对象第2代对象内存释放立即回收。

YAnt的博客 1351

【TC3xx芯片】TC3xx芯片看门狗复位的默认行为分析

TC3xx芯片看门狗复位的默认行为分析

qq_36056498的博客 350

Python关于垃圾回收机制

Python的垃圾回收机制以引用计数为主,标记清除和分代回收为辅。引用计数可以实时回收不再使用的对象,而分代回收则负责处理循环引用,并按代管理对象以提高效率。在大多数情况下,开发者无需关心垃圾回收,但在处理循环引用或性能敏感场景时,了解这些机制有助于优化程序。

m0_64408930的博客 5174

基于Simulink和Control System Toolbox的线控转向(Steer-by-Wire)系统设计

通过上述步骤,我们成功设计并实现了基于 Simulink 和 Control System Toolbox 的线控转向(Steer-by-Wire)系统。该系统能够接收来自方向盘的角度指令,经过控制器处理后,驱动转向执行器(如电动机),实现对车辆前轮转向角度的精确控制。通过虚拟场景仿真、硬件在环测试和实车测试,验证了系统的响应速度、控制精度、车辆稳定性和实时性能,并通过参数优化进一步提升了系统的性能。

MHD0815的博客 549

简述python垃圾回收机制_简单介绍python的垃圾回收机制

这篇文章主要介绍了python垃圾回收机制的相关资料,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下什么是垃圾回收机制?首先,咱先来解释名词,垃圾回收是不是就是将没用的,废弃的东西回收起来。在坐的各位都没有女朋友对吧,那难以想象你们的房间会是一个什么样子,可能会有很多垃圾,很凌乱,自己也不收拾。那当你有了女朋友了就不一样了,她会帮你收拾房间,把没用的垃圾都给你扔掉。那在我们Pytho...

weixin_39595085的博客 440

YOLO26改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达

简单相加、拼接融合无法建立深浅层双向约束关系,浅层微小目标易被深层背景覆盖,深层全局信息难以修正浅层噪声;普通单路自注意力仅单一层内建模依赖,缺少跨层级特征互引导机制,深浅特征信息割裂;标准多头跨注意力计算量大、参数量高,轻量化单模态检测/分割网络部署困难,无法区分前景目标与背景噪声。为此设计单模态轻量化交叉注意力LCA,构建浅层细节、深层语义双分支双向引导结构,轻量完成跨层级特征交互,同步降噪并强化单模态微小目标特征。

Limiiiing的博客 522

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

python垃圾回收机制原理_详解python的垃圾回收机制

python的垃圾回收机制一、引子我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(简称垃圾)就应该将其占用的内存空间给回收掉,而变量名是访问到变量值的唯一方式,所以当一个变量值没有关联任何变量名时,我们就无法再访问到该变量值了,该变量值就是一个垃圾会被python解释的垃圾回收机制自动回收二、什么是垃圾回收机制垃圾回收机制(简称GC)是python解释器自带的...

weixin_39926014的博客 1260

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python的垃圾回收机制_python的垃圾回收机制

python的垃圾回收机制0. 楔子当python解释器执行创建对象等语句时,会在内存中开辟一块空间存储相关内容,但是我们知道内存这个硬件,空间是有限的,比如我的电脑才8G的内存,如果我开发了一个大型程序,里面会创建很多的对象,开辟很多内存空间,但是如果你一直不清理的话,内存就会溢出,会产生内存危机。毫无疑问,内存空间的申请与回收都是非常耗费精力的事情,而且存在很大的危险性,稍有不慎就有可能引发内...

weixin_39612499的博客 100

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Python 垃圾回收机制

垃圾回收机制(简称GC garbage collection)是Python解释器自带一种机制,用来回收不可用的变量值所占用的内存空间。

李少侠 745

python垃圾回收机制原理_Python垃圾回收机制详解

一.垃圾回收机制Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。#encoding=utf-8__author__ = 'kevinlu1010@qq.com'class ClassA():def __init__(self):print 'object born,id:%...

weixin_40000430的博客 157

简述python垃圾回收机制_理解Python垃圾回收机制

一.垃圾回收机制Python中的垃圾回收是以引用计数为主,分代收集为辅。引用计数的缺陷是循环引用的问题。在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存。执行f1()会循环输出这样的结果,而且进程占用的内存基本不会变动c1=ClassA()会创建一个对象,放在0x237cf58内存中,c1变量指向这个内存,这时候这个内存的引用计数是1del c1后,c1变量不再...

weixin_39979159的博客 258

Python中的垃圾回收机制是什么

新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。第一步将标记块1,并记住块2和3以供稍后处理。通过前面的介绍,我们已经知道PyObject是每个对象必有的内容,而当一个对象有新的引用时,它的ob_refcnt就会增加,当引用它的对象被删除,它的ob_refcnt就会减少,当引用计数为0时,该对象生命就结束了。

hakesashou的博客 681

Python的垃圾回收机制

详解python中的垃圾回收机制

m0_56059292的博客 1084
上一篇: python 下划线_汇总
下一篇: C++ 创建动态库及两种方法调用动态库
越甲八千
博客等级 码龄11年 2954粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值