Java was designed to make manual memory management a non-concern. Yet, ironically, it's the runtime that require more explicit memory tuning than any others.
For 90% of workflows you don't add any command line arguments, for the remaining 10% you may specify a heap size. That's all.
What do you think happens in case of literally any other platform/programming language when you go near the limit? You are just either forced to change code, or.. well just put up your hand in the air, I guess and maybe buy better hardware?