python的内存管理机制主要分为三个部分:引用计数、垃圾回收和内存池机制。
引用计数机制:
python通过维护每个对象的引用计数来跟踪内存中的对象。当对象被创建时就会有一个引用计数,当对象不再被使用时,引用计数为0,python就会自动释放该对象所占用的内存。引用计数的python内存管理机制的基础。
通过它可以快速的回收不再被使用的对象。
Python使用引用计数来跟踪对象的引用情况。每当一个对象被引用时,它的引用计数就会加1;
当一个对象的引用被删除时,它的引用计数就会减1。当一个对象的引用计数为0时,说明没有任何引用指向它,这时垃圾回收机制会将其所占用的内存释放掉。引用计数是一种简单而高效的内存管理方式,但它无法解决循环引用的问题。
python
import sys
a =[]
b=a
count = sys.getrefcount(a)
print( count )
#a 的引用计数值为 3,因为有 a、b 和作为 refcount 都引用了一个空列表
垃圾回收机制(简称GC garbage collection):
python使用垃圾回收器来清理那些引用计数为0的对象所占用的内存。
python中的垃圾回收机制主要有两种:标记清除和分代回收。
标记清除是python最早的垃圾回收算法
分代回收是pyton的另一种垃圾回收算法,它将内存分为三代,每一代的存活时间越长,就越不容易被回收。
除了引用计数外,Python还使用垃圾回收机制来处理循环引用等无法通过引用计数解决的内存管理问题,垃圾回收机制会定期检查程序中的对象,找出那些没有被引用的对象,并将其释放掉。Python使用的垃圾回收算法是基于分代的垃圾回收算法,即将对象分为不同的代,根据对象的存活时间来决定何时进行垃圾回收。一般情况下,新创建的对象会被分配到第0代,如果经过一定的时间后仍然存活,则会被晋升到下一代。垃圾回收机制会根据不同代的对象进行不同频率的回收,以提高垃圾回收的效率。
内存池机制:
python中的内存池是一个缓存区,用于管理小于256个字节的对象的内存分配。
当对象的大小小于256K时,python会使用内存池进行内存分配,
否则就会直接调用C标注库中的malloc/realloc等函数进行内存分配。
内存池的作用就是避免了频繁地进行内存分配和释放,从而提高了程序的执行效率。
Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统
对于Python对象,以下几种情况,都有其独立的私有内存池。(字符串的驻留机制)
1、字符串长度为0或者1
2、符合标识符的字符串(只包含字符数字下划线)
3、字符串只在编译时进行驻留,而非运行时
4、[-5,256]之间的整数数字
怎么优化内存管理
手动垃圾回收
先调用del a;再调用gc.collect()即可手动启动GC(嵌套的引用删除不了,因为引用计数为1)
调高垃圾回收阈值
gc.set threshold 设置垃圾回收阈值(收集频率)
避免循环引用