I have a short attention span so I couldn’t make my way through the Wikipedia article.
I understand there are several techniques for garbage collection but a common one is the ‘reachability’ test, where an object’s eligibility for collection is based on whether or not it can be ‘reached’ by a rooted object (which, to my understanding is an object that is known to not require collection). When you want to know if a certain object is reachable, how would you go about it? How do you know where to look?
The collector obviously must be aware of all allocated objects and rooted objects. How does it determine the reachability of each of these objects?
By walking the pointers/references, I’d say. In principle you just look whether an object still has references pointing to it (from other objects, local variables of currently executed code, …). If it hasn’t then no reference to this object can be obtained again (in languages like Java, at least where you can’t do pointer trickery), so it’s usually safe to throw that particular object away.
Other schemes used (or still in use) are for example reference counting where each object has a counter of references to it which must be incremented each time someone gets a reference to that object and decremented each time someone loses a reference to that object. COM in Windows works that way, if I remember correctly.
Java and .NET use (among others) generational garbage collection where each object is initially assumed to die very quickly (generational hypothesis). It then emplos some optimizations to keep garbage collection cycles fast and thus not disrupt the programs running too much. In ye olde times it wasn’t uncommon for GC to lock up a program while it ran, sometimes for several seconds.
Aside from that, GC usually only runs when memory is low, i. e. too many dead objects have accumulated and need to be reclaimed. That’s why most managed applications seem to waste much more memory compared to unmanaged ones, even though in many cases much of that memory can be reclaimed by running the GC once.