.Python 是如何进行内存管理的?
答: 从三个方面来说, 一对象的引用计数机制, 二垃圾回收机制, 三内存池机制
1对象的引用计数机制
Python 内部使用引用计数, 来保持追踪内存中的对象, 所有对象都有引用计数.
引用计数增加的情况:
? 一个对象分配一个新名称
? 将其放入一个容器中 (如列表, 元组或字典)
引用计数减少的情况:
? 使用 del 语句对对象别名显示的销毁
? 引用超出作用域或被重新赋值
sys.getrefcount( ) 函数可以获得对象的当前引用计数
多数情况下, 引用计数比你猜测得要大得多. 对于不可变数据 (如数字和字符串), 解释器会在程序的
不同部分共享内存, 以便节约内存.
2垃圾回收
? 当一个对象的引用计数归零时, 它将被垃圾收集机制处理掉.
? 当两个对象 a 和 b 相互引用时, del 语句可以减少 a 和 b 的引用计数, 并销毁用于引用底层对象的名
称. 然而由于每个对象都包含一个对其他对象的应用,
因此引用计数不会归零, 对象也不会销毁.(从而导致内存泄露). 为解决这一问题, 解释器会定期执
行一个循环检测器, 搜索不可访问对象的循环并删除它们.
3内存池机制
Python 提供了对内存的垃圾收集机制, 但是它将不用的内存放到内存池而不是返回给操作系统.
?Pymalloc 机制. 为了加速 Python 的执行效率, Python 引入了一个内存池机制, 用于管理对小块内存
的申请和释放.
?Python 中所有小于 256 个字节的对象都使用 pymalloc 实现的分配器, 而大的对象则使用系统的
malloc.
? 对于 Python 对象, 如整数, 浮点数和 List, 都有其独立的私有内存池, 对象间不共享他们的内存池.
也就是说如果你分配又释放了大量的整数, 用于缓存这些整数的内存就不能再分配给浮点数
来源: http://www.bubuko.com/infodetail-2961010.html