在Python中,内存管理涉及一个包含所有Python对象和数据结构的私人堆。此私人堆管理由内部Python内存管理器保证。PythonMemory Manager具有不同的组件来处理各种动态存储管理问题,例如共享,共享,,,,,共享,,,共享,共享,共享,共享,,,,共享,共享,共享,,,,共享,共享,共享,共享,,例如共享,共享,,例如共享,共享,,例如共享,共享,,例如共享,共享,,例如共享,共享,,例如共享,共享,,例如共享,共享,,则可以处理。分割,预分配或缓存。
在最低级别上,原始内存分配器与操作系统的内存管理器进行交互,以确保私有堆中有足够的空间来存储与Python相关的所有数据。在原始内存分配中,特定分布人的几个对象正在运行相同的一束和不同的内存管理策略是根据每个对象类型的特征实现的。例如,堆中整数对象的管理方法与字符串,组或字典不同,因为整数需要不同的存储要求,因此,速度和空间称重。因此,Python内存管理器将某些作业分配给对象的特定分配器,但请确保后者在私人桩的范围内运行。
python桩内存的管理由解释器执行,用户无法控制它。为了避免对小对象显得太多的GC数(<= 512bytes),从而导致性能消耗。Python由一个小型管理使用子分布(内存池)的对象。对于大块对象,标准C中的分配器用于分配内存。Python分为三个级别,分为三个级别:AREANA,池,块,块
块是最小的水平。每个块只能包含一个固定的尺寸python对象。大小为8-512 bytes,以8个比例为一步,分为64个不同块的64个不同的块
1-8809-1616117-2424225-32323 ......... 505-51251263POOL是相同大小的块集合。在正常情况下,池的大小为4KB,这与该大小一致虚拟内存页面。限制池中块的大小以修复它。当对象的一个块在当前池中的一个块中销毁时,池内存管理可以将新生成的对象放入块对象中。
具有相同大小的池通过两条链接列表连接(PrevPool,NextPool字段).SIDX用于识别块类型。ArenainDex确定了目前的哪个竞技场。Ref.Count标识当前正在使用多少个块。FreeBlock可以在当前池中识别块的指针。Freeblock实际上是由单个链接列表实现的。当一个块为空时,将块插入freeblock链接列表的头部。
每个游泳池都有三个状态:
使用:部分使用。
满:满
空:空
对于一个良好的高效管理池,Python使用额外的阵列和使用的池来管理它。RUSEDPOOL将每个特征大小的头指针按顺序计算,并且根据两个路线链接列表连接相同的尺寸池。当您分配新的新时内存空间,创建特定的池大小,只需使用二手锅来查找头指针和遍历。当没有内存空间时,您只需要在池的头部二线链接列表的头部插入一个新池即可。
池和块都不会直接进入内存分配,它们将使用从竞技场分配的内存空间。Arena是在堆上分布的块形内存,提供64个池
所有竞技场还使用双链列表来连接(Prevarena,Nextarena Field)。nfreepools和ntotalpools存储当前可用的池信息。FREEPOOLS指针指向当前可用的pools.arena结构很简单,责任是将内存分配给池上的存储器。需求。当竞技场是空的时,竞技场的记忆将返回操作系统。
GC模块是我们在Python中内存管理的接口。通常,Python程序员不需要关心其程序的内存管理问题,但是有时,如果您发现程序有内存泄漏,则可能需要使用GC模块接口。。
一些Python系统关闭自动垃圾回收。该计划判断回收的时间。据说已经完成了Instagram系统,并且总体运营效率已提高了10%。
共同功能:
set_debug(flags):设置GC的调试日志,通常设置为gc.debug_leak以查看内存泄漏的对象。
收集([生成]):执行垃圾恢复。恢复了带有周期参考的对象。该功能可以传递参数。0仅表示0代的垃圾对象,1表示0代和第一代的对象,而2表示0、1和第二代的对象。如果您不传递参数,则将使用2作为默认参数。
get_threshold():获得GC模块的垃圾回收阈值。返回到元组,0是零代的阈值,第一个是第一代的阈值,第二代是第二代的阈值。
set_threshold(阈值[,阈值1 [,阈值2]):设置执行垃圾回收的阈值。
get_count():获取对当前垃圾恢复的自动执行的反击。返回元组。0th是零生成的垃圾对象的数量,第一个是零代链接列表的时间数,第二个是链接的次数的次数。