跳到主要内容

Python 内存泄漏分析--常用命令

GC

gc.enable(); gc.disable(); gc.isenabled()  # 开启gc(默认情况下是开启的);关闭gc;判断gc是否开启
gc.collection() # 执行一次垃圾回收,不管gc是否处于开启状态都能使用
gc.set_threshold(t0, t1, t2); gc.get_threshold() # 设置垃圾回收阈值; 获得当前的垃圾回收阈值
# 注意:gc.set_threshold(0)也有禁用gc的效果
gc.get_objects() # 返回所有被垃圾回收器(collector)管理的对象。这个函数非常基础!只要python解释器运行起来,就有大量的对象被collector管理,因此,该函数的调用比较耗时!
gc.get_referents(*obj) # 返回obj对象直接指向的对象
gc.get_referrers(*obj) # 返回所有直接指向obj的对象

Pyrasite

$ pyrasite -l  # 显示可以使用的脚本
$ pyrasite-memory-viewer pid # 查看当前进程的最大对象
$ pyrasite-shell pid # 进入调试
# globals()和locals()查看全局和本地变量

objgraph

(Pdb) import objgraph
(Pdb) objgraph.show_most_common_types(limit=20) # 查看最常用的类型
function 22750
dict 15520
tuple 12536
weakref 6679
list 5516
type 3449
getset_descriptor 3408
cell 2566
set 2496

(Pdb) objgraph.show_growth(limit=10) # 查看增长最快的类型
function 22749 +22749
dict 15515 +15515
tuple 12332 +12332
weakref 6680 +6680
list 5517 +5517
type 3449 +3449
getset_descriptor 3408 +3408
cell 2565 +2565
set 2496 +2496
ModuleSpec 1588 +1588

objgraph.by_type('list') # 查看某个类型

pympler

(Pdb) from pympler import tracker
(Pdb) tr = tracker.SummaryTracker()
(Pdb) tr.print_diff()

types | # objects | total size
======================= | =========== | ============
<class 'list | 12769 | 1.18 MB
<class 'str | 12769 | 950.47 KB
<class 'int | 2513 | 68.71 KB
<class 'code | 1 | 144 B
function (store_info) | 1 | 136 B
<class 'cell | 2 | 96 B
<class 'tuple | 1 | 64 B
<class 'method | -1 | -64 B
<class 'dict | 0 | -128 B
(Pdb) tr.print_diff()
types | # objects | total size
============== | =========== | ============
<class 'list | 1 | 88 B
<class 'str | 1 | 70 B
(Pdb) tr.print_diff()
types | # objects | total size
======= | =========== | ============
(Pdb)