A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

python的内存管理机制分为:引用计数,垃圾回收,内存池。
1.引用计数
python中的对象在被引用时,它的引用计数会增加1,当它不再引用的时候,引用技术会减去1,当对象的引用计数变为0的时候,这个对象就会被删除掉。
2.垃圾回收
当对象的引用计数为0的时候,对象被删掉,对象就成为要被回收的垃圾,对象就可以被垃圾回收。
如果两个对象循环引用,即两个对象的引用计数为一,但只是在两个之间循环引用,这时会进行标记清除,先将循环引用的计数去掉,再得到两个对象的有效计数,再进行垃圾回收。
从前面标记清除这样的垃圾收集机制来看,这种垃圾收集机制所带来的额外操作实际上与系统中总的内存块的数量是相关的,当需要回收的内存块越多时,垃圾检测带来的额外操作就越多,而垃圾回收带来的额外操作就越少;反之,当需回收的内存块越少时,垃圾检测就将比垃圾回收带来更少的额外操作。举个例子:当某些内存块 M 经过了 3 次垃圾收集的清洗之后还存活时,我们就将内存块 M 划到一个集合A 中去,而新分配的内存都划分到集合 B 中去。当垃圾收集开始工作时,大多数情况都只对集合 B 进行垃圾回收,而对集合 A 进行垃圾回收要隔相当长一段时间后才进行,这就使得垃圾收集机制需要处理的内存少了,效率自然就提高了。在这个过程中,集合 B 中的某些内存块由于存活时间长而会被转移到集合 A 中,当然,集合 A 中实际上也存在一些垃圾,这些垃圾的回收会因为这种分代的机制而被延迟。
3.内存池
Python 的内存机制呈现金字塔形状,-1,-2 层主要有操作系统进行操作;第 0 层是 C 中的 malloc,free 等内存分配和释放函数进行操作;第 1 层和第 2 层是内存池,有 Python 的接口函数 PyMem_Malloc 函数实现,当对象小于256K 时有该层直接分配内存;第 3 层是最上层,也就是我们对 Python 对象的直接操作Python 在运行期间会大量地执行 malloc 和 free 的操作,频繁地在用户态和核心态之间进行切
换,这将严重影响 Python 的执行效率。为了加速 Python 的执行效率,Python 引入了一个内存池
机制,用于管理对小块内存的申请和释放。
Python 内部默认的小块内存与大块内存的分界点定在 256 个字节,当申请的内存小于 256 字节
时,PyObject_Malloc 会在内存池中申请内存;当申请的内存大于 256 字节时,PyObject_Malloc 的
行为将蜕化为 malloc 的行为。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马