gc.garbage
7stud
bbxx789_05ss at yahoo.com
Thu Aug 30 14:25:35 EDT 2007
On Aug 30, 3:50 am, "Martin v. Löwis" <mar... at v.loewis.de> wrote:
> > gc.set_debug(gc.DEBUG_LEAK)
> > print gc.garbage
>
> > --output:--
> > []
> > gc: uncollectable <Dog 0x56e10>
> > gc: uncollectable <Cat 0x56e30>
> > gc: uncollectable <dict 0x58270>
> > gc: uncollectable <dict 0x43e40>
>
> gc.garbage is filled only after these messages
> are printed, not before. You need to add an explicit
> call to gc.collect() if you want to see what
> uncollectable garbage you have.
>
> Regards,
> Martin
Hi,
Thanks for the response. I had a cut and paste error in my reply, so
here it is again with the corrections...
Now, if I run the code:
------------
import gc
class Cat(object):
def __del__():
pass
class Dog(object):
def __del__():
pass
def some_func():
the_dog = Dog()
the_cat = Cat()
the_dog.cat = the_cat
the_cat.dog = the_dog
some_func()
gc.set_debug(gc.DEBUG_LEAK)
gc.collect()
print gc.garbage
-----------
I get this output:
----------
gc: uncollectable <Dog 0x56e10>
gc: uncollectable <Cat 0x56e30>
gc: uncollectable <dict 0x58300>
gc: uncollectable <dict 0x43e40>
[<__main__.Dog object at 0x56e10>, <__main__.Cat object at 0x56e30>,
{'cat': <__main__.Cat object at 0x56e30>}, {'dog': <__main__.Dog
object at 0x56e10>}]
-----------
Why are there two entries in the list for each uncollectable
object(same addresses)? Also, I haven't bound the names "cat" or
"dog" anywhere in my program. What do those names mean in the list?
Doing some further testing, if I eliminate the __del__ methods:
-----------
import gc
class Cat(object):
pass
class Dog(object):
pass
def some_func():
the_dog = Dog()
the_cat = Cat()
the_dog.cat = the_cat
the_cat.dog = the_dog
some_func()
gc.set_debug(gc.DEBUG_LEAK)
gc.collect()
print gc.garbage
-------------------
I get this output:
-----
gc: collectable <Dog 0x56e10>
gc: collectable <Cat 0x56e30>
gc: collectable <dict 0x58270>
gc: collectable <dict 0x43e40>
[<__main__.Dog object at 0x56e10>, <__main__.Cat object at 0x56e30>,
{'cat': <__main__.Cat object at 0x56e30>}, {'dog': <__main__.Dog
object at 0x56e10>}]
-----
The docs say:
---------
garbage
A list of objects which the collector found to be unreachable but
could not be freed (uncollectable objects).
--------
Since debugging doesn't show any uncollectable objects, why isn't
gc.garbage empty? The docs also say:
----
garbage
...By default, this list contains only objects with __del__() methods.
----
Does set_debug() change the default?
More information about the Python-list
mailing list