对于Python来说,内存管理涉及所有Python对象和堆栈。Python的内存管理器在内部确保堆管理和分配。Python的内存管理器具有不同的组件,用于处理动态存储管理的各个方面,例如共享、分区、预分配或缓存。
在最低级别,原始内存分配器通过与操作系统的内存管理器交互来确保堆上有足够的空间来存储所有与Python相关的数据。在原始内存分配器之上,多个特定于对象的分配器在同一堆上运行,并实现适合每种对象类型特征的不同内存管理策略。
例如,整数对象在堆上的管理方式与字符串、元组或字典不同,因为整数意味着不同的存储要求和速度/空间权衡。因此,Python的内存管理器将一些工作委托给特定于对象的分配器,但确保后者在堆边界内运行。
重要的是要理解Python的堆管理是由解释器本身完成的,用户无法控制它,尽管他们经常操作指向堆中内存块的对象指针。Python内存管理器通过本文档中列出的Python/CAPI函数实现Python对象和其他内部缓冲区的按需堆空间分配。
为了避免内存损坏,扩展编写者不应尝试使用C库导出的函数来操作Python对象:malloc()、calloc()、realloc()和free()。这将导致C分配器和Python内存管理器之间的混合调用,从而带来致命的后果,因为它们实现不同的算法并在不同的堆栈上运行。
在大多数情况下,我们建议从Python堆分配内存,因为后者由Python内存管理器控制。例如,当使用用C编写的新对象类型扩展解释器时,这是必需的。使用Python堆的另一个原因是希望通知Python内存管理器有关扩展模块的内存要求。能够将所有内存请求委托给Python的内存管理器还可以为整个解释器带来更准确的内存占用。因此在某些情况下,Python的内存管理器可能会也可能不会触发适当的操作,例如垃圾收集、内存压缩等。
上一篇:python 读取内存数据
下一篇:python 内存基址