gc questions
Jeremy Hylton
jeremy at zope.com
Wed Jun 18 11:27:26 EDT 2003
On Wed, 2003-06-18 at 07:39, Edward K. Ream wrote:
> I have several questions about gc:
>
> 1. The gc documentation says: " This module...provides access to
> unreachable objects that the collector found but cannot free." I thought
> the gc could free cycles. Why would the gc be unable to free objects that
> are, in fact, no longer being used?
A cycle of unreachable objects where one or more of the objects has a
finalizer is uncollectable. The garbage collector can't know which
__del__ method to call first, if, in fact, it's safe to call any of them
first.
I believe the garbage collector could call an __del__ for cycles
involving only a single finalizer, but it doesn't.
> 2. What do the terms "collectable" and "uncollectable" garbage mean? The gc
> will show such objects when gc.set_debug(gc.DEBUG_STATS) is in effect.
See answer above.
> 3. I have not been able to do anything with gc.get_objects() except get its
> length. For example, the following throws an exception:
I'm surprised that you have a problem. I've used it without any
trouble.
> global lastObjectList
>
> gc.disable()
> objects = gc.get_objects()[:] # omitting [:] also fails.
> gc.enable()
I'm surprised that you call gc.disable() and gc.enable() here. There's
very little chance that a collection will occur as a result of calling
get_objects(). Even if it does occur, what's the problem?
I also don't understand why you make a copy of the list? It's probably
a very big list and I don't see any need to duplicate it.
> if lastObjectList:
> for o in objects: # This can fail!
> if o not in lastObjectList:
> print id(o)
> lastObjectList = objects
>
> The exception is thrown at the statement "for o in objects:" and the
> exception is a unicode error!
>
> Is there anything obviously wrong in this example? Being able to see which
> objects have just been added to the get_objects() list would be most
> helpful.
Are you sure there error isn't on the "o not in lastObjectList" line?
If you have a Unicode string and a regular string containing non-ASCII
characters, you'll get a UnicodeError when you try to compare them.
Are you sure you want to do a quadratic time algorithm for this? You're
doing a compare on every object in lastObjectList every time through the
for loop.
You might also be interested to try sys.getobjects(), which is only
available in a debug build of Python. It returns all objects, not just
those involved in garbage collection.
Jeremy
More information about the Python-list
mailing list