The only way to *really* guarantee 100% predictable memory
reclamation
is to write your own. Except that we all know how scalable and
bug-free
that is. Not to mention, when you need to deallocate a large
complex
data structure, *somebody* has to do the work -- either you do
it
yourself, or the reference counting implementation, or the GC.
No matter
how you cut it, it's work that has to be done, and you have to
pay for
it somehow; the cost isn't going to magically disappear just
because you
use reference counting (or whatever other scheme you dream up).
Actually it completely disappears in a copying collector since
only the live data is copied over ...