我是靠谱客的博主 纯真小蝴蝶,最近开发中收集的这篇文章主要介绍python内存池机制,python基础—12python内存管理机制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、内存池机制

1、对象池

面试题目: python内存管理机制是什么?

1). 由于python中万物皆对象,内存管理机制就是对象的存储问题,Python会分 配一块内存空间去存储对象。

2) 对于整数和短小的字符等,python会执行缓存机制,即将这些对象进行缓存, 不会为相同的对象分配多个内存空间

3). 容器对象,如列表、元组、字典等,存储的其他对象,仅仅是其他对象的引 用,即地址,并不是这些对象本身

2、小整数对象池

整数在程序中的使用非常广泛,Python为 了优化速度,使用了小整数对象池,避免为整数 频繁申请和销毁内存空间。

Python对小整数的定义是 [-5,257) 这些整数对象是提前建立好的,不会被垃圾 回收。在一个Python的程序中,所有位于这 个范围内的整数使用的都是同一个对象.

464af86887e6b296140cae34f5b921b0.png

7a9a86d45fe3c2f343998c8de2253794.png

f1b9680109c95d7c820ad3b23437d0a2.png

3、字符串驻留机制

string interning(字符串驻留): 它通过维护一个字符串常量池(string intern pool), 从而试图只保存唯一的字符串对象,达到既高效又节省内存地处理字符串的目的。

创建新的字符串对象时,Python 先比较常量池中是否有相同的对象(interned),有 的话则将指针指向已有对象,并减少新对象的指针,新对象由于没有引用计数,就会被 垃圾回收机制回收掉,释放出内存。

字符串(含有空格),不可修改,没开启intern机制,不共用对象,引用计数为0,销毁。

4624ed21e678248ae32b095254d6abe2.png

4、内存溢出与内存泄漏

内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用。 比方说,定义了20个字节大小的内存空间,却写入了21个字节的数据。

内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间。 若内存泄露堆积, 内存逐渐减少,从而降低性能。

内存泄漏会最终导致内存溢出

5、垃圾回收机制

为什么需要Garbage collection?

为了防止内存泄露. 对编程语言来说,GC 就是一个无名英雄,拼命地将垃圾回收再利用。

Python采用的是引用计数机制为主,标记-清除和分代收集两种机制为辅的垃圾回收策略。

二、引用计数

1、定义

GC 原本是一种“释放怎么都无法被引用的对象的机制”。那么人们自然而然地就会想 到,可以让所有对象事先记录下“有多少程序引用自己”。让各对象知道自己的“人气指 数”,从而让没有人气的对象自己消失,这就是引用计数法(Reference Counting).

python里每一个东⻄都是对象,它们的核心就是结构体: PyObject。 当引用计数为0时,该对象生命就结束了。

2、引用计数器工作机制

(1)一个对象会记录着引用自己的对象的个数,

每增加一个引用,个数+1,每减 少一个引用,个数-1

(2)查看引用对象个数的方法:

导入sys模块,使用模块中的getrefcount方法: sys.getrefcount()

由于这里也是一个引用,故输出的结果多1

(3)引用计数器机制:利用引用计数器方法,在检测到对象引用个数为0时,对普通 的对象进行释放内存的机制

导致引用计数+1的情况:

对象被创建

例如 a=1

对象被引用

例如 b=a

对象被作为参数,传入到一个函数中

例如 func(a)

对象作为一个元素,存储在容器中

例如 list=[a,a]

导致引用计数-1的情况:

对象的别名被显式销毁

例如 del a

对象的别名被赋予新的对象

例如 a=3

一个对象离开它的作用域

例如 f函数执行完后,f函数中的局部变量

对象所在的容器被销毁或从容器中删除对象

例如 del li[0]

3、引用计数机制的优点和缺点

(1)优点

简单

实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定 时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。

(2)缺点:

维护引用计数消耗资源

会存在循环引用:

list1 = []

list2 = []

list1.append(list2)

list2.append(list1)

list1和list2都为空,但是list1与list2相互引用,如果不存在其他对象对它们的引用,list1与list2的引用计数也仍然为1,所占用的内存永远无法被回收,这将是致命的。

三、标记-清除

如它的字面意思一样,GC 标记 - 清除算法由标记阶段和清除阶段构成。

标记阶段:是把所有活动对象都做上标记的阶段。

清除阶段:是把那些没有标记的对象,也就是非活动对象回收的阶段。

通过这两个阶段,就可以令不能利用的内存空间重新得到利用。

如果说被标记的对象是存活的,剩下的未被标记的对象只能是垃圾,这意味 着我们的代码不再会使用它了。

清除这些无用的垃圾对象,把它们送回到可用列表

四、分代回收

分代垃圾回收(Generational GC)在对象中导入了“年龄”的概念,通过优先回收容 易成为垃圾的对象,提高垃圾回收的效率。

分代垃圾回收中把对象分类成几代,针对不同的代使用不同的 GC 算法,

我们把刚生成 的对象称为新生代对象,

到达一定年龄的对象则称为老年代对象。

新生代 GC 将存活了一定次数的新生代对象当作老年代对象来处理。我们把类似于这 样的新生代对象上升为老年代对象的情况称为晋升(promotion)。

老年代对象很难成为垃圾,所以我们对老年代对象减少执行 GC 的频率, 从而提高效率。

最后

以上就是纯真小蝴蝶为你收集整理的python内存池机制,python基础—12python内存管理机制的全部内容,希望文章能够帮你解决python内存池机制,python基础—12python内存管理机制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部