Destroy the original pointer before the collector sees it. This requires performing special code on each read or write. The compiler can simply generate and inline this code. Normally, a write-barrier is used. GC is run on this copy.
Any new object is colored black.
This is a conservative approach, since while GC is taking place, it may be that more objects become unreachable. Starting marking the graph using tricolors. If a pointer is installed into a black object, then marked the referenced object gray. Continue until completion. It is possible to color newly allocated objects either white or black.