Python 内存管理和回收
Python对内存的管理要从三个方面来说
对象的引用机制#
Pyhton的内部使用引用计数,来保持内存中的对象,所有对象都有引用计数。
引用计数增加:#
一个对象分配一个新名称
将其放入一个容器中(列表、元素或字典)
引用减少的情况#
使用del语句将对象的别名显式的销毁
对象的一个别名被赋值给其他对象
对象从一个窗口对象中移除,或,窗口对象本身被销毁
一个本地引用离开了它的作用域
注:获取引用对象:通过sys.getrefcount( )函数获取某个引用的引用数,函数参数实际上创建了一个临时的引用。因此,getrefcount( )所得到的结果,会比期望多1。
垃圾回收#
当一个对象的引用计数归零时,它将被垃圾回收机制处理掉。
python的自动垃圾回收#
当分配对象的次数和取消分配对象的次数的差值高于某个阈值时,垃圾回收才会启动。
分代回收#
python分代回收基本策略:Pyhton认为存活时间越久的对象,越不可能在后面的程序中变成垃圾。(在垃圾回收的过程中,减少“长寿”对象的扫描频率)。
1
Python将所有的对象分为0, 1, 2三代。所有新建的对象都是0代对象。
2
当某一代对象经历过垃圾回收,依然存活,那么它就被归入下一代对象。
3
每次垃圾回收启动时,一定会扫描所有0代对象。如果0代对象经过一定次数 垃圾回收,那么就会启动0代和1代的扫描清理。
4
当1代经历一定次数的垃圾回收后,那么会启动对0,1,2,即对所有对象进行扫描。
5
对于函数set_threshold(),返回(700, 10, 10),700为分配对象和取消分配对象的差值,当差值大于700时,启动垃圾回收;
6
每10次0代垃圾回收,会配合1次1代回收
内存池机制#
Python的内存垃圾回收机制,将不用的内存放到内存池而不是返回给操作系统。
1
为了加速Python的执行效率,Python引入内存池机制,用于管理对小块内存的管理和释放。
对于所有小于256个字节的对象都使用pymalloc实现的分配器;而大于这个长度的对象则使用系统的malloc。
2
对于Python对象,如整数、浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。如果你分配又释放了大量的整数,用于缓存这些整数的内存不能再分配给浮点数
作者:StKali
出处:https://www.cnblogs.com/StKali/p/13158782.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
博文没看懂?或希望就某些问题深入探讨的,欢迎骚扰: 微信: AirVenus, Email: clarkmonkey@163.com。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步