python类的内存空间_python如何管理内存?

Python的内存管理由内置的内存管理器负责,使用引用计数机制自动分配和释放内存。当对象的引用计数变为零时,垃圾回收器会自动回收内存。垃圾回收器分为三代,有不同的阈值来决定何时运行。尽管大多数情况下程序员无需直接干预,但在处理引用循环时,可以使用`gc`模块手动触发垃圾回收。
摘要由CSDN通过智能技术生成

介绍

内存管理是有效分配,重新分配和协调内存的过程,以便所有不同的进程都能平稳运行并可以最佳地访问不同的系统资源。内存管理还涉及清除不再访问的对象的内存。

在Python中,内存管理器通过定期运行以清理,分配和管理内存来负责此类任务。与C,Java和其他编程语言不同,Python通过使用引用计数来管理对象。这意味着内存管理器会跟踪对程序中每个对象的引用数。当对象的引用计数降至零(这意味着不再使用该对象)时,垃圾回收器(内存管理器的一部分)会自动从该特定对象释放内存。

178960917_1_20191227115650675

用户不必担心内存管理,因为内存的分配和取消分配过程是全自动的。回收的内存可以由其他对象使用。

Python垃圾回收

如前所述,Python删除程序中不再引用的对象以释放内存空间。Python释放不再使用的内存块的过程称为垃圾收集。Python 垃圾收集器(GC)在程序执行期间运行,如果引用计数减少为零,则将触发Python 垃圾收集器。如果为对象分配了新名称或将其放置在诸如元组或字典之类的容器中,则引用计数会增加。同样,当重新分配对对象的引用,对象的引用超出范围或删除对象时,引用计数也会减少。

178960917_2_20191227115650863

内存是一个堆,其中包含程序中使用的对象和其他数据结构。此堆空间的分配和取消分配由Python内存管理器通过使用API函数控制。

内存中的Python对象

Python中的每个变量都充当一个对象。对象可以是简单的(包含数字,字符串等),也可以是容器(字典,列表或用户定义的类)。此外,Python是一种动态类型化的语言,这意味着我们无需在程序中使用它们之前就声明变量或其类型。

例如:

178960917_3_2019122711565119

如果看上面程序的前两行,对象x是已知的。当我们删除对象x并尝试使用它时,会收到一条错误消息,指出x未定义变量。

您会看到Python中的垃圾回收是完全自动化的,并且程序员无需担心,与C之类的语言不同。

修改垃圾收集器

Python垃圾收集器具有三代对象分类。生命周期起点的一个新对象是第一代垃圾收集器。随着对象在垃圾回收中幸存下来,它将被提升到下一代。3代垃圾收集器中的每一个都有一个阈值。具体地说,当超过分配数量的阈值减去解分配数量时,该生成将运行垃圾回收。

与上一代相比,前几代也更经常收集垃圾。这是因为较新的对象比旧的对象更有可能被丢弃。

该gc模块包括更改阈值,手动触发垃圾收集过程,禁用垃圾收集过程等功能。我们可以使用以下get_threshold()方法检查不同代垃圾收集器的阈值:

178960917_4_20191227115651222

样本输出:(700, 10, 10)

如您所见,这里第一代的门槛为700,其他两代的门槛为10。

我们可以使用模块的set_threshold()方法来更改触发垃圾收集过程的阈值gc:gc.set_threshold(900, 15, 15)

在上面的示例中,我们增加了所有3代的阈值。增加阈值将减少运行垃圾收集器的频率。通常,作为开发人员,我们无需过多考虑Python的垃圾回收,但这在为目标系统优化Python运行时时可能很有用。关键好处之一是Python的垃圾回收机制自动为开发人员处理了许多底层细节。

为什么要执行手动垃圾收集?

我们知道Python解释器会跟踪对程序中使用的对象的引用。在Python的早期版本(直到1.6版)中,Python解释器仅使用引用计数机制来处理内存。当引用计数降至零时,Python解释器会自动释放内存。这种经典的引用计数机制非常有效,只是当程序具有引用周期时它无法工作。如果一个或多个对象相互引用,则会发生一个引用循环,因此引用计数永远不会达到零。

让我们考虑一个例子。

178960917_5_20191227115651347

上面的代码创建了一个引用循环,其中对象list引用了自身。因此,list当函数返回时,对象的内存将不会自动释放。参考循环问题无法通过参考计数来解决。但是,可以通过更改Python应用程序中垃圾回收器的行为来解决此参考周期问题。

为此,我们可以使用模块的gc.collect()功能gc。

结论

在本文中,我们讨论了如何通过使用引用计数和垃圾回收策略来自动处理Python中的内存管理。没有垃圾回收,就不可能在Python中实现成功的内存管理机制。另外,程序员不必担心删除已分配的内存,因为Python内存管理器会注意这一点。这样可以减少内存泄漏并提高性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值