Размер кучи должен быть «правильным» для вашего приложения, чтобы найти правильный, хотя это нелегко. Если он слишком мал, у вас не хватает памяти, если слишком много, вы тратите впустую память и рискуете сделать длинные GC-паузы. Когда что-то идет не так (а они всегда идут не так), чем больше у вас кучи, тем больше кучи нужно отлаживать и тем дольше будут проявляться утечки.
В идеале я бы установил -Xms
в качестве размера, который, по моему мнению, должен запускать мое приложение, а -Xmx
- в значение, большее, чем это (но не слишком большое). Всегда включайте подробную сборку мусора и составьте график используемой кучи, чтобы проверить значения, которые вы установили.
Когда я рисую кучу, я смотрю на количество коллекций и их тип. Важно не иметь слишком много. Однако также важно не иметь кучу настолько огромную, чтобы их было мало, потому что когда они произойдут (и полный сбор данных неизбежен), они повредят. В идеале ищется регулярный набор хорошо разнесенных gcs с очень малым временем паузы.
При этом для 32-битной Windows -Xms
должно быть таким же, как -Xmx
, это потому, что Java (оставляя в стороне jrockit) требует непрерывной памяти, а карта памяти Windows фрагментирована, поэтому платит за получение и блокировку кучи, как можно раньше.