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