浅谈一下python的内存管理机制
python采用的是引用计数机制为主,标记-清除和分代回收两种机制为辅的策略
在python中,每一个对象的核心就是一个结构体,它的内部有一个引用计数器,程序运行过程中会实时的更新ob_refcnt的值,来反映引用当前对象的名称数量,当某个对象的引用计数为0,那么它的内存就会被立即释放掉。
对象存储
在Python中万物皆对象
不存在基本数据类型,
0, 1.2, True, False, "abc"
等,这些全都是对象所有对象, 都会在内存中开辟一块空间进行存储
分代回收
分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为三代,分别为年轻代(0代),中年代(1代),老年代(2代),他们对应的是三个链表,它们的垃圾收集频率与对象的存活时间的增大而减小
新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,以此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。
同时,分代回收是建立在标记清除技术基础之上。作为Python的辅助垃圾收集技术处理那些容器对象
垃圾回收
有三种情况会触发垃圾回收:
- 调用
gc.collect()
,需要先导入gc
模块。 - 当
gc
模块的计数器达到阀值的时候。 - 程序退出的时候。
gc
模块
gc
模块提供一个接口给开发者设置垃圾回收的选项。上面说到,采用引用计数的方法管理内存的一个缺陷是循环引用,而gc
模块的一个主要功能就是解决循环引用的问题。
多次赋值
对于整数和短小的字符,Python会进行缓存,不会创建多个相同对象
此时,被多次赋值,只会有多份引用
id和hex
在python的内置函数中,可以通过id获取内存地址(10进制),通过hex()可以查看16进制地址
- Post link: https://www.godhearing.cn/python-de-la-ji-hui-shou-ji-zhi/
- Copyright Notice: All articles in this blog are licensed under unless otherwise stated.