How to check what is holding reference to object

Chris Rebert clp2 at rebertia.com
Tue Apr 27 17:58:48 EDT 2010


On Tue, Apr 27, 2010 at 2:42 PM, Michal M <mich.mierzwa at googlemail.com> wrote:
> On 27 Kwi, 23:21, Duncan Booth <duncan.bo... at invalid.invalid> wrote:
>> Michal M <mich.mier... at googlemail.com> wrote:
>> > I've just found out that one of objects is not destroyed when it
>> > should be. This means that something was holding reference to this
>> > object or part of it (i.e. method). Is there any way to check what
>> > holds that reference? I am unable to do that just looking to the code
>> > or debugging it because it is pretty complicated, but I am able to
>> > invoke this situation again.
>>
>> See if this code helps:
>>
>> http://groups.google.com/group/comp.lang.python/browse_thread/thread/...
>>
>> It's pretty old so it may need some adjustment, but I wrote it
>> to figure out exactly that sort of problem.
>
> Thanks you for answers.
> I tried to use gc.get_referrers(self) in point in code when according
> to me object should be destroyed earlier but I did not see anything
> interesting. Then just realised that gc will not destroy object even
> when itself holds reference to his own method.
>
> For example
>
> class A(object):
>  def a(self):
>    pass
>  def b(self):
>    self.method = self.a
>  def __del__(self):
>    print "A object deleted"
>
>>> a = A()
>>> del a
> A object delted
>>> a = A()
>>> a.b()
>>> del a
> ... nothing ...
>
> I thought gc would discover such circle loops but apparently it did
> not.

No, it does, you just didn't give it long enough; for performance
reasons, cyclical GC is only done every so often:

>>> from weakref import ref
>>> class A(object):
...  def a(self):
...    pass
...  def b(self):
...    self.method = self.a
...
>>> a = A()
>>> def bye(x): print "BYE:", x
...
>>> b = ref(a, bye)
>>> del a
BYE: <weakref at 0x377990; dead>
>>> a = A()
>>> b = ref(a, bye)
>>> a.b()
>>> del a
>>>
>>> #indeed, it didn't get GC-ed immediately
>>> from gc import collect
>>> collect() #but if we force a cyclical GC run...
BYE: <weakref at 0x4441b0; dead>

Cheers,
Chris
--
http://blog.rebertia.com



More information about the Python-list mailing list