使用 psutil 和 psleak 检测 C 扩展中的内存泄漏

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

psutil 7.2.0 引入了新 API,用于检测 Python C 扩展中的内存泄漏。新函数 heap_info() 和 heap_trim() 有助于识别和减少内存泄漏。此外,psleak 工具可以自动检测 C 扩展的内存泄漏,增强了 Python 项目的调试能力。

🎯

关键要点

  • psutil 7.2.0 引入了用于检测 C 扩展内存泄漏的新 API。
  • 新函数 heap_info() 和 heap_trim() 可以帮助识别和减少内存泄漏。
  • heap_info() 提供了直接的分配器统计信息,包括当前通过 malloc() 分配的字节数。
  • heap_trim() 提供了一种请求释放未使用内存的跨平台方法,主要用于泄漏检测工具。
  • psleak 是一个新的工具,可以自动检测 C 扩展的内存泄漏,增强了 Python 项目的调试能力。
  • psleak 通过多次调用目标函数并跟踪内存变化来识别内存泄漏。
  • psutil 现在不仅是一个监控库,还是一个实用的调试工具,特别适用于依赖 C 扩展的 Python 项目。

延伸问答

psutil 7.2.0 新增了哪些功能来检测 C 扩展的内存泄漏?

psutil 7.2.0 引入了 heap_info() 和 heap_trim() 两个新 API,用于检测 C 扩展中的内存泄漏。

heap_info() 函数提供了哪些内存分配统计信息?

heap_info() 提供了当前通过 malloc() 分配的字节数、通过 mmap() 分配的字节数,以及在 Windows 上创建的私有堆的数量。

heap_trim() 的主要用途是什么?

heap_trim() 主要用于请求释放未使用的内存,帮助减少内存泄漏检测中的噪声。

psleak 工具是如何检测 C 扩展的内存泄漏的?

psleak 工具通过多次调用目标函数并跟踪内存变化来识别内存泄漏,若内存持续增长则标记为泄漏。

使用 psutil 检测内存泄漏的基本步骤是什么?

基本步骤包括:先获取堆的基线快照,调用 C 扩展多次,然后再获取快照并比较内存使用情况。

为什么传统的内存指标无法检测 C 扩展中的内存泄漏?

传统内存指标如 RSS 和 VMS 无法检测 C 扩展中的内存泄漏,因为 Python 的内存分配器位于平台的本地堆之上,导致某些内存分配不被监测到。

➡️

继续阅读