浅谈一下python的内存管理机制

python采用的是引用计数机制为主,标记-清除分代回收两种机制为辅的策略

在python中,每一个对象的核心就是一个结构体,它的内部有一个引用计数器,程序运行过程中会实时的更新ob_refcnt的值,来反映引用当前对象的名称数量,当某个对象的引用计数为0,那么它的内存就会被立即释放掉。

对象存储

在Python中万物皆对象

不存在基本数据类型,0, 1.2, True, False, "abc"等,这些全都是对象

所有对象, 都会在内存中开辟一块空间进行存储

分代回收

分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,Python将内存分为三代,分别为年轻代(0代),中年代(1代),老年代(2代),他们对应的是三个链表,它们的垃圾收集频率与对象的存活时间的增大而减小

新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,以此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。

同时,分代回收是建立在标记清除技术基础之上。作为Python的辅助垃圾收集技术处理那些容器对象

垃圾回收

有三种情况会触发垃圾回收:

  1. 调用gc.collect(),需要先导入gc模块。
  2. gc模块的计数器达到阀值的时候。
  3. 程序退出的时候。

gc模块

gc模块提供一个接口给开发者设置垃圾回收的选项。上面说到,采用引用计数的方法管理内存的一个缺陷是循环引用,而gc模块的一个主要功能就是解决循环引用的问题。

多次赋值

对于整数和短小的字符,Python会进行缓存,不会创建多个相同对象

此时,被多次赋值,只会有多份引用

id和hex

在python的内置函数中,可以通过id获取内存地址(10进制),通过hex()可以查看16进制地址