Skip to main content

python内存管理

· 3 min read
Czasg

python 在开发过程中,不需要像 C/C++ 那样需要手动申请并回收内存。
这得益于高级语言的内存管理机制。所有的 python 对象和数据结构都存储在私有堆中,由内存管理器进行管理。

垃圾回收

python 的垃圾回收主要有三种机制:引用计数标记清除分代回收

首先通过"引用计数",来保持追踪内存中的对象,以便创建和回收。
然后通过"标记-清除"解决对象之间可能产生的循环引用问题。
最后通过"分代回收",以空间换时间的方法提高垃圾回收效率。

引用计数

首先是 引用计数,这是最简单的一种回收机制:
为每一个对象维护一个引用计数,有变量或者容器结构引用时,该对象的引用计数加一,反之减一。
当对象的引用计数值为 0 时,则可以进行回收。

但是引用计数有一个致命的缺陷,就是循环引用,在这种场景下对象间的引用计数无法清零,会造成资源泄露。

标记清除

标记清除算法分为标记阶段和清除阶段:
标记阶段:从根对象开始遍历,将可以访问到的对象标记为可达对象。
清除阶段:将不可达对象清除。

虽然 标记-清除 可以很好的解决引用计数中循环依赖造成的资源泄露问题,但是标记清除它本身是一个很笨重的行为, 需要STW(stop the world)且遍历全部对象。

分代回收

分代回收基于一个统计理论,即存活越久的对象,被清除的可能性就越小。所以为了提高性能,引入了分代回收算法。
将对象分为三代:0、1、2代,活过一次 gc,则分配到下一代。

默认阈值为:700、10、10
700:表示新创建对象减去从新对象中回收的对象的值,大于 700 则进行一次 0 代回收。
10:10 次 0 代回收触发一次 1 代回收。
10:10 次 1 代回收触发一次 2 代回收。


👇👇👇

本文作者: Czasg
版权声明: 转载请注明出处哦~👮‍