Okay the garbage collector now "works"! In the sense that it can remove garbage from the system. (The problem before was I have a list of roots which includes any item the VM is currently operating on,, and roots were… never… getting removed… from the root list.)
It still does *not* work, in the sense that after the collection every pointer in the system is pointing to the wrong object. Oops!