Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
2.7.10, 3.1.3
-
None
-
None
Description
Hi,
I'm running Apache 2.0.50, mod_python 3.1.3 with Python 2.3.4 on Windows XP Pro and Windows 2000 server.
I finally found a source for the memory leaks I have been observing for a while now : if you store an object in the request object that reference directly or indirectly the request object itself, it builds a circular reference. This circular reference does not seem to be garbage collected.
The test handler :
from mod_python import apache
def handler(req):
- req.foobar=req
req.content_type='text/html'
req.write('OK')
return apache.OK
I used Apache Benchmark :
ab -c 5 -n 100000 http://localhost/test.py
With the comment line, everything is OK, I do not see any memory leak.
If I uncomment the 'req.foobar=req' line, the memory leak shows up. My Apache process normally uses around 20 MB without the comment, and in 30 seconds of running the above handler (comment removed) with the above Apache Benchmark command, it reaches 125 MB !
Normally, circular reference are collected by the garbage collector of Python, but unfortunately when defining object from C, you have to do a few tricks to support this :
http://www.python.org/doc/2.3.4/api/supporting-cycle-detection.html
It seems that this is not done in mod_python, by having a look at requestobject.c.
I find this quite a big problem, and I don't find any workaround except "Don't reference the request object from anywhere that might be referenced by the request object", which is a pretty big limitation, quite annoying in the application I'm building.