Any gc pause is unacceptable if your goal is predictable throughput and latency

Modern gcs can be pauseless, but either way you’re spending CPU on gc and not servicing requests/customers.

As for c++, std::unique_ptr has no ref counting at all.

shared_ptr does, but that’s why you avoid it at all costs if you need to move things around. you only pay the cost when copying the shared_ptr itself, but you almost never need a shared_ptr and even when you need it, you can always avoid copying in the hot path

> Modern gcs can be pauseless, but either way you’re spending CPU on gc and not servicing requests/customers.

Since memory is finite and all computation uses some, every program spends CPU on memory management regardless of technique. Tracing GCs often spend less CPU on memory management than low-level languages.

> std::unique_ptr has no ref counting at all.

It still needs to do work to free the memory. Tracing GCs don't. The whole point of tracing GCs is that they spend work on keeping objects alive, not on freeing memory. As the size of the working set is pretty much constant for a given program and the frequency of GC is the ratio of allocation rate (also constant) to heap size, you can arbitrarily reduce the amount of CPU spent on memory management by increasing the heap.