> That's when you measure and optimize.
How do you "optimize" the GC away after you wrote your entire database server in a language that uses it?
Object pooling and bump allocators using persistent scratch buffers, mostly. The latter what you'd use for read buffers in I/O intensive applications like databases and the like.
Starting by using a GC language that is strongly typed, compiles to native code, supports value types, memory pools/arenas if required, which provides best of both worlds.
Where GC means any kind of GC algorithm from CS point of view.
GC languages typically have features of the language and/or standard library that make GC the default, not the only option.
Lots of ways but an obvious and generic answer is to use pooling.
It's incredibly in common in game development, C# has a lot of features you can take advantage for this.
But the most naive example any language supports is simple object pooling.
Then more fancy, zero allocations tasks in C# https://github.com/cysharp/unitask