This issue tracker has been migrated to GitHub ,
and is currently read-only.
For more information,
see the GitHub FAQs in the Python's Developer Guide.
Created on 2006年04月13日 05:04 by dobesv, last changed 2022年04月11日 14:56 by admin. This issue is now closed.
| Files | ||||
|---|---|---|---|---|
| File name | Uploaded | Description | Edit | |
| subtypecleardict.diff | arigo, 2006年04月13日 09:58 | Patch (for 2.5, probably applies to 2.4 as well) | review | |
| test4.py | arigo, 2006年04月13日 09:59 | Another leak. | ||
| test_dictself.py | hitchmanr, 2010年03月05日 06:18 | unit test to check whether "self.__dict__ = self" leaks | ||
| Messages (9) | |||
|---|---|---|---|
| msg28217 - (view) | Author: Dobes V (dobesv) | Date: 2006年04月13日 05:04 | |
Using: ActivePython 2.4.2 Build 10 (ActiveState Corp.) based on Python 2.4.2 (#67, Jan 17 2006, 15:36:03) [MSC v.1310 32 bit (Intel)] on win32 For reasons I do not understand, the following class leaks itself continuously: class AttrDict(dict): def __init__(self, *args, **kw): dict.__init__(self, *args, **kw) self.__dict__ = self Whereas this version does not: class AttrDict(dict): def __init__(self, *args, **kw): dict.__init__(self, *args, **kw) def __getattr__(self, key): return self[key] def __setattr__(self, key, value): self[key] = value My test looks like this: for n in xrange(1000000): import gc gc.collect() ad = AttrDict() ad['x'] = n ad.y = ad.x print n, ad.x, ad.y And I sit and watch in the windows task manager while the process grows and grows. With the __getattr__ version, it doesn't grow. |
|||
| msg28218 - (view) | Author: Armin Rigo (arigo) * (Python committer) | Date: 2006年04月13日 09:58 | |
Logged In: YES user_id=4771 This is caused by the tp_clear not doing its job -- in this case, tp_clear is subtype_clear(), which does not reset the __dict__ slot to NULL because it assumes that the __dict__ slot's content itself will be cleared, which is perfectly true but doesn't help if self.__dict__ is self. Attached a patch to fix this. It's kind of hard to test for this bug because all instances of AttrDict are really cleared, weakrefs to them are removed, etc. Also attached is an example showing a similar bug: a cycle through the ob_type field, with a object U whose class is itself. It is harder to clear this link because we cannot just set ob_type to NULL in subtype_clear. Ideas welcome... |
|||
| msg28219 - (view) | Author: Neal Norwitz (nnorwitz) * (Python committer) | Date: 2006年04月14日 07:19 | |
Logged In: YES user_id=33168 Armin, why not just check any leaking test cases into Lib/test/leakers? I have no idea if your patch is correct or not. I wouldn't be surprised if there are a bunch more issues similar to this. What if you stick self in self.__dict__ (I'm guessing this is ok, but there are a bunch of variations) or start playing with weakrefs? |
|||
| msg100453 - (view) | Author: Ryan Hitchman (hitchmanr) | Date: 2010年03月05日 06:18 | |
Attached test case demonstrates the leak. |
|||
| msg114653 - (view) | Author: Mark Lawrence (BreamoreBoy) * | Date: 2010年08月22日 09:22 | |
I've reproduced this problem with 2.7, 3.1 and 3.2. |
|||
| msg114783 - (view) | Author: Armin Rigo (arigo) * (Python committer) | Date: 2010年08月24日 12:55 | |
Added the two tests in Lib/test/leakers as r45389 (in 2006) and r84296 (now). |
|||
| msg155084 - (view) | Author: Hrvoje Nikšić (hniksic) * | Date: 2012年03月07日 12:52 | |
Could this patch please be committed to Python? We have just run into this problem in production, where our own variant of AttrDict was shown to be leaking. It is possible to work around the problem by implementing explicit __getattr__ and __setattr__, but that is both slower and trickier to get right. |
|||
| msg155141 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2012年03月08日 00:53 | |
New changeset 3787e896dbe9 by Benjamin Peterson in branch '3.2': allow cycles throught the __dict__ slot to be cleared (closes #1469629) http://hg.python.org/cpython/rev/3787e896dbe9 |
|||
| msg155144 - (view) | Author: Roundup Robot (python-dev) (Python triager) | Date: 2012年03月08日 01:15 | |
New changeset c7623da4e2af by Benjamin Peterson in branch '2.7': allow cycles throught the __dict__ slot to be cleared (closes #1469629) http://hg.python.org/cpython/rev/c7623da4e2af |
|||
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2022年04月11日 14:56:16 | admin | set | github: 43198 |
| 2012年03月09日 08:55:08 | eric.snow | set | nosy:
+ eric.snow |
| 2012年03月08日 01:15:42 | python-dev | set | messages: + msg155144 |
| 2012年03月08日 00:53:07 | python-dev | set | status: open -> closed nosy: + python-dev messages: + msg155141 resolution: fixed stage: patch review -> resolved |
| 2012年03月07日 23:02:44 | pitrou | set | nosy:
+ vstinner |
| 2012年03月07日 12:59:27 | flox | set | nosy:
+ flox title: __dict__ = self in subclass of dict causes a memory leak? -> __dict__ = self in subclass of dict causes a memory leak |
| 2012年03月07日 12:52:29 | hniksic | set | nosy:
+ hniksic messages: + msg155084 |
| 2011年11月03日 09:59:00 | Boris.FELD | set | nosy:
+ Boris.FELD |
| 2011年06月12日 18:47:50 | terry.reedy | set | nosy:
- BreamoreBoy versions: + Python 3.3, - Python 3.1 |
| 2010年09月18日 15:47:00 | benjamin.peterson | link | issue1441 superseder |
| 2010年08月24日 12:55:07 | arigo | set | messages: + msg114783 |
| 2010年08月22日 09:22:08 | BreamoreBoy | set | versions:
+ Python 3.1, Python 2.7, Python 3.2, - Python 2.6 nosy: + BreamoreBoy messages: + msg114653 type: behavior -> resource usage stage: test needed -> patch review |
| 2010年03月05日 06:18:21 | hitchmanr | set | files:
+ test_dictself.py nosy: + hitchmanr messages: + msg100453 |
| 2009年03月21日 02:07:25 | rhettinger | set | priority: normal -> high |
| 2009年03月21日 02:03:52 | ajaksu2 | set | stage: test needed type: behavior components: + Interpreter Core, - None versions: + Python 2.6, - Python 2.4 |
| 2006年04月13日 05:04:48 | dobesv | create | |