python 内存管理和垃圾回收

本文介绍了Python的内存管理,包括对象池的概念和应用场景,以及垃圾回收机制的重要性和实现方式,如引用计数、标记清除和分代收集。特别讨论了引用计数的优缺点,并展示了如何使用gc模块进行垃圾回收的控制和检查。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存管理

python的内存管理相对于C,C++等语言来说要简单一些,相当于托管的状态,首先关于对象的创建和引用,python提供了对象池这样的一个容器,就是将一堆对象放置到一起,需要用的时候,就从对象池中取出,用完再放回对象池中,这样的优点是速度快,不需要每一次都新创建。
在对象池中放置的对象有,单个字符,如a,A,b,B…等,小整数,[-5, 257),单个英文单词,apple,banana等,但是对于大整数,多个单词组合出现的情况,对象池中不包含这些内容,需要新创建。

垃圾回收机制

垃圾回收是内存管理中非常重要的一环,garbage collection,对于新对象的话需要分配内存,但是如果分配了内存不回收,就会造成内存不够用,从而导致内存泄露,所以需要做识别垃圾对象,回收内存这一个工作。
在python中,垃圾回收方法主要使用的是引用计数方法,然后使用标记清除算法和分代收集算法辅助,来完成整个的垃圾回收机制。

引用计数机制

引用计数机制方法,主要就是判断这个变量的引用是否为0,如果为0,则回收这个变量,如果大于0,则不回收,采用这种方法的优点是简单实时,但是缺点是消耗的资源也比较多,需要耗费资源来进行计数,而且无法收集具有循环引用的变量,比如a变量引用了b变量,b变量也引用了a变量,那这样引用计数就永远不会降为0,也就不会被回收。
在引用计数机制中,出现引用+1的情况有以下几种

  1. 创建对象的时候
  2. 引用对象的时候
  3. 将变量传入函数中使用的时候
  4. 当变量是某个元素的成员的时候

出现引用计数-1的情况

  1. 销毁别名的时候
  2. 别名重新赋值的时候
  3. 离开作用域,也就是相当于局部变量离开函数的时候
  4. 容器被销毁的时候

用户可以通过getrefcount()方法来查看变量的引用数
在这里插入图片描述

gc模块

而分代收集算法则可用来弥补引用计数机制的不足,解决循环引用的问题,在使用之前需要先导入垃圾回收gc模块,触发垃圾回收可以使用gc.collect()方法。
使用gc.get_count()方法查看当前内存变量引用情况,返回一个长度为三的元组,第一个元素的意义是当前对象的数量,第二个元素的意义是清理零代列表的次数,第三个元素的意思是清理一代列表的次数。
使用gc.get_threshold()可以获取当前设置清理的阈值,返回相同的元素,第一个表示已创建的对象的个数-已回收的对象的个数>700,则进行0代链表的清零,第二个说明每清理10次0代链表,清理一次1代链表,顺便清理一次0代链表,第三个说明每清理10次1代链表,清理一次2代链表,顺便清理一次0,1代链表。还可以采用set方法来设置自己想要的阈值。
在这里插入图片描述
使用gc.garbage查看垃圾列表,目前为空
在这里插入图片描述
也可以使用gc.disable()关掉垃圾回收机制,但是这样做会带来风险,除非业务需求,否则不要轻易尝试,使用gc.enable()打开垃圾回收机制,具体gc的用法可以使用help命令查看完整内容
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值