This feels like it’s partway toward reinventing 1970s garbage collection. The remaining steps:
One implementation I read about (in the Smalltalk green book, but I don’t think it was new when it appeared in the documented Smalltalk implementation) was to maintain two handle tables. Periodically, swap to the other table for new allocations, and when objects are accessed migrate them and every object that can be reached from them from the prior table to the new one. When it comes time to swap back to the first table, clear out any objects that are still only found there.
You’ll find that these systems often use arena/slab allocation–a level loads, and the whole thing is chucked away after the subsystem is shutdown.
More general GC stuff is usually not of huge interest to game developers, and with good reason.
There was an article (unfortunately I can’t find a link at the moment because I can’t think of the title or enough search terms to recover it) in the early 1980s suggesting that the short-lived object collector run all the time and the full tracing collector run when the user takes a break, such as when they leave the computer for a coffee. “The user has not yet pressed fire to start the next level” would be an analogous case.
This sounds a lot like Entity Component Systems
Entity Component Systems usually utilize this pattern but this pattern doesn’t make an ECS. 👍