So you "only" have to make significant, error prone (by using unsafe) code changes as opposed to tuning a couple of parameters for the GC to account for a different workload? Again, this shows the superiority of the JVM here.
And the same approaches can be done in Java (e.g. self-managed off heap allocations), even more-so when they introduce value types.
Object pools are really easy.
Unsafe is only for extreme cases. Some cache libraries use it. You don't have to code it yourself.
Yes this is better than relying on the end user/admin to tune things. It is more predictable.
I you're looking for high throughput you just need to allocate less. Or use unsafe. And it's totally doable.