garbage collection / cyclic references

Aaron Brady castironpi at gmail.com
Sun Mar 22 10:33:45 EDT 2009


On Mar 21, 11:59 am, "andrew cooke" <and... at acooke.org> wrote:
> Aaron Brady wrote:
> > My point is, that garbage collection is able to detect when there are
> > no program-reachable references to an object.  Why not notify the
> > programmer (the programmer's objects) when that happens?  If the
> > object does still have other unreachable references, s/he should be
> > informed of that too.
>
> i think we're mixing python-specific and more general / java details, but,
> as far as i understand things, state of the art (and particularly
> generational) garbage collectors don't guarantee that objects will ever be
> reclaimed.  this is a trade for efficiency, and it's a trade that seems to
> be worthwhile and popular.

It's at best worthless, but so is politics.  I take it back; you can
reclaim memory in large numbers with a probabilistic finalizer.  The
expected value of reclaiming a KB with a 90% chance of call is .9 KB.

The allocation structure I am writing will have a very long up-time.
I can forcibly reclaim the memory of an object involved in a cycle,
but lingering references it has will never be detected.  Though, if I
can't guarantee 100% reclamation, I'll have to be anticipating a
buffer dump eventually anyway, which makes, does it not, 90% about the
same as 99%.

> furthermore, you're mixing responsibilities for two logically separate
> ideas just because a particular implementation happens to associate them,
> which is not a good idea from a design pov.

I think a silent omission of finalization is the only alternative.  If
so they're mixed, one way or the other.  I argue it is closer to
associating your class with a hash table: they are logically separate
ideas.  Perhaps implementation is logically separate from design
altogether.

> i can remember, way back in the mists of time

I understand they were having a fog problem there yesterday... not to
mention a sale on sand.  "Today: Scattered showers and thunderstorms
before 1pm, then a slight chance of showers."

> using java finalizers for
> doing this kind of thing.  and then learning that it was a bad idea.  once
> i got over the initial frustration, it really hasn't been a problem.  i
> haven't met a situation

I don't suppose I imagine one.  So, you could argue that it's a low
priority.  Washing your hands of the rare, though, disqualifies you
from the associate's in philosophy.  I bet you want to meet my
customers, too.

> where i needed to tie resource management and
> memory management together (except for interfacing with c code that does
> not use the host language's gc - and i can imagine that for python this is
> a very strong (perhaps *the*) argument for reference counting).

I'm using a specialized mapping type to implement the back end of user-
defined classes.  Since I know the implementation, which in particular
maps strings to objects, I can always just break cycles by hand; that
is, until someone wants a C extension.  Then they will want tp_clear
and tp_traverse methods.

> as an bonus example, consider object caching - a very common technique
> that immediately breaks anything that associates other resources with
> memory use.

I assume your other processes are notified of the cache state.  From
what I understand, Windows supports /named/ caching.  Collaborators
can check the named cache, in the process creating it if it doesn't
exist, and read and write at will there.

> just because, in one limited case, you can do something, doesn't mean it's
> a good idea.
>
> andrew

But you're right.  I haven't talked this over much on the outside, so
I might be missing something huge, and serialized two-step
finalization (tm) is the secret least of my worries.



More information about the Python-list mailing list