博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用urllib2的HttpResponse导致内存不回收(内存泄漏)
阅读量:6192 次
发布时间:2019-06-21

本文共 2733 字,大约阅读时间需要 9 分钟。

  • 问题出现环境:python 2.7.1(X)及以下, Windows(或CentOS)

这个问题产生在lib/urllib2.py的line 1174 (python 2.7.1),导致形成了cycle,即使调用gc.collect()也不能释放到HttpResponse等相关联对象(gc.garbage可以查看)

1    r.recv = r.read 2  3         fp = socket._fileobject(r, close=True) 4  5          resp = addinfourl(fp, r.msg, req.get_full_url()) 6  7         resp.code = r.status 8  9         resp.msg = r.reason10 11         return resp

在python官方网站上很早发现了此BUG(见以下两个issues),但就是没有正式解决此问题。不过以下两个threads可以得到workarounds。

 


  • 引申一下,如果python代码写成这样(自己写代码犯的一个错误),会导致以上相同cycle问题,从而导致内存泄漏。
1 class T(object):2     def __init__(self):3         self.test = self.test04         5     def test0(self, d={}):6         d['a'] = 1

在python shell运行如下:

1 Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] on win32 2 Type "help", "copyright", "credits" or "license" for more information. 3 >>> import gc 4 >>> gc.set_debug(gc.DEBUG_LEAK) 5 >>> class T(object): 6 ...     def __init__(self): 7 ...         self.test = self.test0 8 ... 9 ...     def test0(self, d={}):10 ...         d['a'] = 111 ...12 >>> t=T()13 >>> del t14 >>> gc.collect()15 gc: collectable 
16 gc: collectable
17 gc: collectable
18 319 >>> for _item in gc.garbage:20 ... print _item21 ...22 <__main__.T object at 0x0260D870>23
>24 {
'test':
>}

导致不能释放内存即是以上红色字体部分,可以通过调用GC自带两方法查看为什么会形成cycle。

1 >>> t2=T() 2 >>> gc.get_referrers(t2) 3 [
>, {
'__builtins__':
, 't2': <__main__.T object at 0x0260D890>, '__package__': None, 'gc' 4 :
, 'T':
, '__name__': '__main__', '__doc__': None, '_item': {
'test':
>}}] 5 >>> for _item in gc.get_referrers(t2): 6 ... print _item 7 ... 8
> 9 { '__builtins__':
, 't2': <__main__.T object at 0x0260D890>, '__package__': None, 'gc':
, 'T':
, '__name10 __': '__main__', '__doc__': None, '_item': {...}}11 >>> for _item in gc.get_referents(t2):12 ... print _item13 ...14 {'test':
>}15
gc.get_referrers:Return the list of objects that directly refer to any of objs. 返回引用t2的对象,包括
>对象
gc.get_referents:Return a list of objects directly referred to by any of the arguments.
返回被t2引用的对象,包括
>对象
  • 以下情况不产生cycle:
1 class T2(object): 2     def __init__(self): 3         pass 4          5     def test(self): 6         return self.test0() 7          8     def test0(self, d={}): 9         d['a'] = 110 class T3(object):11     def __init__(self):12         self.test = self.test013         14     @classmethod    15     def test0(cls, d={}):16         d['a'] = 117     kkk = test0

 

 

 

 

 

 

转载于:https://www.cnblogs.com/lxg226/p/3153960.html

你可能感兴趣的文章
【转】理解红黑树
查看>>
OBJEct-c中NSDictionary的用法
查看>>
Safari/Chrome中placeholder属性实现不完整
查看>>
转载 - 18个最佳代码编辑器/IDE推荐
查看>>
用Opencv保存视频文件avi(转)
查看>>
几条常见的数据库分页 SQL 语句
查看>>
XCode最佳实践之最佳数据类型
查看>>
asp.net 中sender 的理解
查看>>
RSS文章订阅及生成RSS格式的xml
查看>>
你自认为理解了JavaScript?
查看>>
读《程序员的SQL金典》[4]--SQL调优
查看>>
死锁产生的原因及四个必要条件
查看>>
CSS3----background:-webkit-gradient()渐变效果
查看>>
RTP协议分析
查看>>
前后端分离了,然后呢?(转)
查看>>
自定义控件:滑动开关按钮
查看>>
js修改后没反应-看看是不是取的缓存
查看>>
【iCore3 双核心板_ uC/OS-III】例程十一:任务消息队列
查看>>
C#的delegate简单练习
查看>>
【301】IDL与C#混合编程
查看>>