一次实践得到的对python垃圾收集的经验

最近做一个项目,要求实现对w3af的并发扫描的支持,通过对代码的改造,实现了对同时过来的多个http request进行并发漏洞扫描和分析,但是最担心的问题是会不会产生内容泄漏。

经过对内存使用率的跟踪,发现每次启动一个扫描后,内存都会增加一点点,担心的事情还是发生了。

于是去了解python的垃圾回收机制,了解到python是过一段时间就会启动垃圾回收,是python内部自动进行的,不需要程序员介入,所以上述现象不一定真的是因为程序原因导致内存泄漏。

而且根据这篇博文介绍,只要慎重使用del(不使用),那么就不会产生内存泄漏,对于垃圾来说,等着python去回收就行了(不知道这样理解是否正确)。

最重要的是,我在每次一个扫描结束的代码之后,加上了python gc模块的collect()函数,内存增加的现象不存在了,而且随着程序进入稳定状态,内存比刚创建时候占用的还少,大大出乎预料,这也是python好用的一个原因吧,傻瓜式编程,简单的一行代码,就得到想要的结果。

但是程序性能肯定也下降了,就先不管了,以后考虑定时调用gc.collect(),间隔时间可以长一点。

下面是我写的对cpu和内存占用率的输出日志,可以看到最开始的内存占用率是3%,后面启动了10个扫描后,程序的内存占用率还能降到1%

程序刚启动的内存占用率:

2016-12-08 15:07:02,265  * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
2016-12-08 15:07:03,266 pid:3758, cpu usage:0.000000%, memory usage:3.467736%
2016-12-08 15:07:09,275 pid:3758, cpu usage:0.000000%, memory usage:3.468517%

并发完成10个扫描后,内存占用率降到1%以下

2016-12-08 16:10:15,043 pid:3758, cpu usage:0.000000%, memory usage:0.842817%
2016-12-08 16:10:21,051 pid:3758, cpu usage:0.000000%, memory usage:0.842817%

猜你喜欢

转载自blog.csdn.net/leonard_wang/article/details/53519555