[原创]Python内存泄漏查看器实现
[原创]Python内存泄漏查看器实现
by AKara 2009-04-23 @ http://blog.csdn.net/akara @ akaras@163.com
---------------------------------------------------------------------
为更好定位Python内存泄漏情况,写了一个新的Python内存泄漏查看器模块。
模块有如下功能:
* 将所有对象按框图引用关系输出png图片
* 可调整输出每引用层节点的最大数量
* 可调整泄漏对象往上引用的层次数量
* 各种类型对象用唯一的颜色标识
* 泄漏对象在原颜色上染红色
* 泄漏对象相关的link用红色线条/红色文字
* 用<>特别标识Python对象的特殊结构link文字
所以,根据上图,需要去除内存泄漏要做的工作就是【消除红色框】,
最简单的方式是【消除所有红色link】,但这显然不是最有效的方法————
最有效的方法是尽量切断"顶部"的link(怎么才算"顶部",依赖功能逻辑判定)。
---------------------------------------------------------------------
Python提供了gc.get_referrers方法来获得一个对象的引用者列表,很大程度
上,这已经完成了模块的50%的功能了:因为只要while循环取到get_referrers
并入出双端队列,直至处理为空即可。
但是在输出对象引用关系的有向边信息时,需要仔细地对types模块中所
定义的各种类型的Python对象进行区别对待,甚至有些Python的内部对象类型
连types模块中都没给出,或连Python Manual手册上都不多说一句 :( :
(1)CellType: 一种用于指向upvalue(Lua中这样叫,就这样称呼吧)的对象,
它可被一个或多个clousure的free var tuple引用。虽然Python不希望
使用者注意这个内部的对象类型,但是可以自己动手取得:
CellType = type((lambda x: lambda: x)(1).func_closure[0])
(2)NewStyleClassType: 就是new style class(和old style class相对的)。
讽刺的是Python从引入new style class以来就提倡摒弃old style class
(无论从性能上,方便性上,功能多样性上new style class均胜),但是
相关文档:
urllib模块提供的上层接口,使我们可以像读取本地文件一样读取www和ftp上的数据。每当使用这个模块的时候,老是会想起公司产品的客户端,同事用C++下载Web上的图片,那种“痛苦”的表情。我以前翻译过libcurl教程,这是在C/C++环境下比较方便实用的网络操作库,相比起libcurl,Python的url ......
Python http://www.python.org/download/ wxPython http://www.wxpython.org/download.php#binaries Vpython http://vpython.org/contents/download_windows.html Matplotlib http://sourceforge.net/projects/matplotlib/files/matplotlib/ PyGlet http://www.pyglet.org/download.html PyGame http://www.pyga ......
Ruby和Python的语法比较
其实Ruby和Python非常接近,比大多数别的语言要接近的多,所以喜欢用啥就用啥(大实话,虽然也是废话)。语法上的差别虽然有那么一点,大部分是syntax sugar,我斗胆稍微列几个(python我也忘得差不多了,不对的大家尽管来鞭尸吧),但是主要差异还是设计思想上的:灵活 ......
#coding=utf-8
from math import sqrt,cos,sin
import Image, ImageDraw
class SpireShape(object):
def __init__(self, draw):
self.draw = draw
self.line_width = 1
& ......