Another fun technique similar to hazard pointers is epoch-based memory reclamation (implemented here https://docs.rs/crossbeam-epoch/0.9.13/crossbeam_epoch/ ).
One advantage of these kinds of "localised" garbage collection approaches compared to typical GC is that the cost scales with the size of the specific collection, as opposed to with the total allocation rate / memory usage of the entire program.