На самом деле я всегда считал очень странным, что Java ограничивает размер кучи. Нативное приложение обычно может использовать столько кучи, сколько ему нужно, пока оно не исчерпает виртуальное адресное пространство. Единственная причина ограничить кучу в Java - сборщик мусора, который имеет определенный тип «лени» и может не собирать мусор, если в этом нет необходимости. Это означает, что если вы выберете кучу слишком большой, ваше приложение будет постоянно использовать больше памяти, чем действительно необходимо.
Однако Sun значительно улучшила GC за эти годы, и для эмуляции поведения нативного приложения на C я бы установил начальный размер кучи 32 МБ (для небольших программ) или 64 МБ (для более крупных) и максимум что-то между 1-2 ГБ. Если вашему приложению действительно требуется более 1 ГБ памяти, оно, скорее всего, повреждено (если вы не имеете дело с такими большими объектами данных), но я не вижу причин, по которым ваше приложение должно быть уничтожено, просто потому, что оно превышает определенный размер кучи.
Конечно, это относится к обычным ПК. Если вы создаете код Java для мобильных телефонов или других ограниченных устройств, вам, вероятно, следует принять начальный и максимальный размер кучи к ограничениям этого устройства.