Python内存管理、垃圾回收机制

本文详细探讨了Python内存管理,包括内存分配、引用计数、循环引用及其解决机制,如引用计数、标记-清除和分代回收。同时介绍了如何优化内存管理,以及内存溢出和内存泄露的识别与处理方法。

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

一、各语言内存管理

C和C++:没有内存管理,完全是靠程序员手动释放和申请。
java:通过关键字new为对象申请内存空间,由GC决定和执行对象的释放。

二、Python内存管理&术语

python中一切皆对象,这些对象内存在运行时动态分配。
python变量无需事先申明和指定类型,程序员无需关心内存管理,python解释器会自动回收。
这一切由python内存管理器承担复杂的内存管理工作。

1、内存分配

Python解释器在运行时为程序分配内存。当程序创建变量、对象或函数时,解释器会在内存中为其分配空间。Python使用堆来管理内存,这意味着内存分配和释放是动态的。

2、引用计数

Python使用引用计数来跟踪对象的引用数量。每当一个对象被引用时,其引用计数会增加;当一个引用被删除时,其引用计数会减少。当一个对象的引用计数为0时,解释器会将其标记为垃圾并回收其内存。

3、循环引用

在Python中,循环引用是一种常见的问题。当两个或多个对象相互引用时,它们的引用计数永远不会为0,因此无法被垃圾回收。Python通过周期检测来解决循环引用问题。当检测到循环引用时,解释器会将其标记为垃圾并回收其内存。

当两个对象a和b相互引用时,因此引用计数不会归零,对象也不会销毁,从而导致内存泄露。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。

三、内存管理机制(垃圾回收机制)

python主要采用引用计数机制为主,标记-清除分代收集(分代回收)两种机制为辅的策略。

1、引用计数机制

引用计数是一种垃圾回收机制,当python的某个对象的引用计数为0时,该对象就成为要被回收的垃圾,但是并不是立马回收,而是等到garbage collection (GC)触发时才回收。
注意:
(1)、栈内存、堆内存

  • 栈内存:存放变量和内存地址
    在这里插入图片描述

  • 堆内存:存放值

(2),GC的效率:

在垃圾回收时,python不能进行其他任务,频繁的垃圾回收会大大降低python的工作效率;
原因是GIL的存在,当GC运行的时候,会抢python解释器锁,其他线程处于阻塞状态,会降低python的工作效率,所以GC的回收不要那么频繁。

(3),GC的启动:

当python运行时,会记录其中分配对象和取消对象的次数,当二者的差值高于某个阈值(默认700)时,垃圾回收才会启动。
(4),GC的触发:

  • 主动调用gc.collect()
  • GC达到阈值时自动触发
  • 程序退出时

查看引用计数:

使用sys包中的getrefcount(),来查看某个对象的引用计数。
需要注意的是,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,会比期望的多1。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值