Implement sync-mark budgeting in nonmoving collector
One of the known weakness of the current iteration of the non-moving collector is that some workloads may induce long pauses in the post-mark sync phase of collection. Specifically, if the mutator grows a large update remembered set (or a large set of unmarked objects transitively reachable from the update remembered set) the non-moving collector will need to do a large amount of work serially during the stop-the-world pause. This can result in much longer pauses than desirable.
However, there is an easy solution here: assign a budget to the amount of marking we are willing to perform during the pause. If we find that we exceed our budget during the pause then we can allow the mutators to resume, proceed with marking concurrently, and try the sync again when we are done.