Message29994
Attached is a file which demonstrates an oddity about
traceback objects and the gc.
The observed behaviour is that when the tuple from
sys.exc_info() is stored on an object which is inside
the local scope, the object, thus exc_info tuple, are
not collected even when both leave scope.
If you run the test with "s.e = sys.exc_info()"
commented out, the observed memory footprint of the
process quickly approaches and sits at 5,677,056
bytes. Totally reasonable.
If you uncomment that line, the memory footprint
climbs to 283,316,224 bytes quite rapidly. That's a
two order of magnitude difference!
If you uncomment the "gc.collect()" line, the process
still hits 148,910,080 bytes.
This was observed in production code, where exc_info
tuples are saved for re-raising later to get the stack-
appending behaviour tracebacks and 'raise' perform.
The example includes a large array to simulate
application state. I assume this is bad behaviour
occurring because the traceback object holds frames,
and those frames hold a reference to the local
objects, thus the exc_info tuple itself, thus causing
a circular reference which involves the entire stack.
Either the gc needs to be improved to prevent this
from growing so wildly, or the traceback objects need
to (optionally?) hold frames which do not have
references or have weak references instead.
|
|
Date |
User |
Action |
Args |
2007-08-23 14:43:01 | admin | link | issue1565525 messages |
2007-08-23 14:43:01 | admin | create | |
|