我在这里关注了如何使用 Django 设置 heapy 的优秀帖子:http://www.toofishes.net/blog/using-guppy-debug-django-memory-leaks/
我已经命令 hp.setref() ,现在过了一会儿我还使用 hp.heap() 获取数据:
>>> hp.heap()
Partition of a set of 12075 objects. Total size = 1515496 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 4048 34 339656 22 339656 22 str
1 3112 26 269368 18 609024 40 tuple
2 171 1 169992 11 779016 51 dict (no owner)
3 1207 10 144440 10 923456 61 list
4 49 0 102040 7 1025496 68 dict of module
5 591 5 66984 4 1092480 72 unicode
6 498 4 59760 4 1152240 76 function
7 433 4 51960 3 1204200 79 types.CodeType
8 57 0 50480 3 1254680 83 type
9 36 0 31584 2 1286264 85 dict of class
但现在怎么办?我应该从这个输出中理解什么?我应该如何开始追踪这些“str”和“tuple”对象所属的位置?
使用 get_rp,我得到以下输出:
>>> hp.heap().get_rp()
Reference Pattern by <[dict of] class>.
0: _ --- [-] 12000 (0xd1d340 | 0xd88b50 | 0xf63f00 | __builtin__.Struct | __...
1: a [-] 137 dict (no owner): 0x761c30*160, 0x7655d0*1491, 0x781640*9...
2: aa ---- [-] 45 dict of django.db.models.options.Options: 0xcf3110...
3: a3 [-] 45 django.db.models.options.Options: 0xcf3110, 0xf0bb10...
4: a4 ------ [-] 140 dict of django.db.models.related.RelatedObject: 0x10bec...
5: a5 [-] 140 django.db.models.related.RelatedObject: 0xf14450...
6: a6 -------- [-] 63 dict of django.db.models.fields.related.ForeignKey: 0x...
7: a7 [+] 63 django.db.models.fields.related.ForeignKey: 0xf0e690...
8: a5b ------- [-] 7 dict of django.db.models.fields.related.OneToOneField: ...
9: a5ba [+] 7 django.db.models.fields.related.OneToOneField: 0x15447...
现在 Django 正在泄漏内存,这是正确的假设吗?但是那些没有所有者的字典是什么?
我没有任何使用 heapy 的经验,但根据我的经验,Django(和大多数其他 Python 程序)不会泄漏内存,但它们也不会像某些人希望的那样干净地清理内存。
此外,Django 的设置会导致其出于诊断原因而消耗内存。例如,设置 DEBUG=True 可能会导致它保留所有 SQL 查询,因此进程运行的时间越长,使用的内存就越多。
更新:你的问题不在你的Python代码中。看看heapy给你的总结:代表的内存总大小是1.5Mb!当 Python 程序真正泄漏时,最常见的原因是泄漏的 C 扩展。您是否有在 Django 进程下运行的任何 C 扩展?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)