【问题标题】:Accessing the memory heap in python在python中访问内存堆
【发布时间】:2021-08-27 17:05:02
【问题描述】:

有没有办法在 Python 中访问内存堆?我有兴趣能够访问在运行实例的内存中分配的所有对象。

【问题讨论】:

  • 如果我没记错也没有误解问题,你可以globals()
  • @Sujay:这只会显示在当前模块的全局范围内可见的内容。添加locals() 还可以让您查看给定函数范围内的局部变量,但即便如此,您也看不到闭包/类/实例范围,也看不到在其他局部范围或其他模块的全局变量中分配的变量.
  • 重点是,“堆”是整个程序中每个动态分配对象的公共存储(在 CPython 中,C 堆栈本身几乎没有存储任何观察者感兴趣的内容;Python 级别的调用stack 本身也是堆分配的),它不仅仅是在任何给定时间点在 LEGB 范围内直接可见的少数东西。

标签: python memory


【解决方案1】:

您无法直接访问,但the gc module 应该大部分做您想做的事。一个简单的gc.get_objects() 调用将返回收集器跟踪的所有对象。这不是一切,因为 CPython 垃圾收集器只关心潜在的引用循环(因此无法引用其他对象的内置类型,例如 intfloat、@987654332 @ 等)不会出现在生成的 list 中,但它们都将被 list 中的 something 引用(如果没有,它们的引用计数将为零并且它们会被处理掉)。

除此之外,您可能会从inspect 模块中获得一些更有针对性的用途,尤其是stack frame inspection,使用the traceback module 进行“轻松格式化”或手动挖掘半文档框架对象本身,无论是这将允许您将范围缩小到堆栈帧上的特定活动范围。

对于最接近堆的解决方案,您可以使用the tracemalloc module 来跟踪和记录发生的分配,或使用the pdb debugger 从外部进行实时自省(可能使用adding breakpoint() calls 对您的代码进行自动停止当你到达那个点时让你环顾四周)。

【讨论】:

    猜你喜欢
    • 2017-07-01
    • 2012-01-05
    • 2014-04-15
    • 2012-11-08
    • 1970-01-01
    • 2019-10-16
    • 2017-10-15
    • 2011-11-26
    • 1970-01-01
    相关资源
    最近更新 更多