从三个方面来说,一是对象引用计数机制,二是垃圾回收机制,三是内存池机制1.对象引用计数机制Python内部使用引用计数来跟踪内存所有对象都有引用计数。当引用计数增加时:1、一个对象分配一个新的名字2、放入一个容器(如列表、元组或字典)当引用计数减少时:1、使用del语句显示销毁objectalias2,引用超出范围或被重新分配。sys.getrefcount()函数可以获取对象当前的引用计数。在大多数情况下,引用计数比您猜测的要大得多。对于数字和字符串等不可变数据,解释器会在程序的不同部分之间共享内存以节省内存。二、垃圾回收1、当一个对象的引用计数为零时,将被垃圾回收机制处理掉。2、当两个对象a和b互相引用时,del语句可以减少a和b的引用计数,并破坏用来引用底层对象的名称。但是,由于每个对象都包含对其他对象的引用,因此引用计数不会清零,对象也不会被销毁。(从而导致内存泄漏)。为了解决这个问题,解释器周期性地执行一个循环检测器来搜索不可达对象的循环并将它们移除。3、内存池机制Python提供了内存的垃圾回收机制,但是它将不用的内存放入内存池,而不是归还给操作系统。1.Pymalloc机制。为了加快Python的执行效率,Python引入了内存池机制来管理小块内存的申请和释放。2、Python中所有小于256字节的对象都使用pymalloc实现的allocator,而大对象则使用系统的malloc。3.对于Python对象,比如整数、浮点数、Lists,它们都有自己私有的内存池,对象之间不共享自己的内存池。也就是说,如果你分配和释放了大量的整数,那么用来缓存这些整数的内存就不能再分配给浮点数了。
