我目前正在调试Python程序中的内存泄漏。由于我的所有对象都没有__del__
方法,因此我假设问题是某种全局变量,它继续累积对可到达对象的引用。此外,当我使用gc.debug(gc.DEBUG_LEAK)
运行时,我会看到很多gc: collectable
条消息,但没有gc: uncollectable
条消息。为了证实这种怀疑,我想以某种方式得到我的程序中可达对象总数的计数,所以我可以确认它正在稳步增加。
有没有办法得到这个?我在看gc.get_count
,但这似乎给了我实际收集的对象数(按生成分隔),而不是仍然可以访问的活动对象的数量。
答案 0 :(得分:1)
看起来gc.get_objects
就是你想要的。请谨慎使用DEBUG_LEAK
,因为它意味着DEBUG_SAVEALL
。 DEDUG_SAVEALL
会导致所有未引用的对象保存在gc.garbage
中而不是被释放。这意味着垃圾收集器跟踪的对象数量只会增加。另外gc.get_objects
不返回所有当前活动的对象,因为垃圾收集器不跟踪某些类型(不跟踪原子类型)。例如,[i for i in range(1000)]
只会增加一个跟踪的对象,因为垃圾收集器不会跟踪整数。然而,[[] for i in range(1000)]
将增加1001跟踪的对象数量。