Most JVMs take advantage of a thread local "bump" allocator[1] as well to avoid having to cross JVM or kernel boundaries to allocate memory, which can result in huge speedups for memory-intensive use cases.
[1] https://shipilev.net/jvm/anatomy-quarks/4-tlab-allocation/