Начало выделения памяти для JVM - PullRequest
2 голосов
/ 29 апреля 2010

Я начинаю использовать параметр -Xmx в команде java, чтобы разрешить моим процессам использовать немного больше памяти (256 МБ, хотя я думаю, что в настоящее время я использую менее 128 МБ). Я также заметил параметр -Xms для запуска памяти со значением по умолчанию 2Mb. Что я должен установить это значение и почему?


Ссылка: Java

Ответы [ 4 ]

8 голосов
/ 29 апреля 2010

Аргумент -Xmx определяет максимальный объем памяти, который может достичь куча для JVM. Вы должны хорошо знать свою программу и посмотреть, как она работает под нагрузкой, и соответственно установить этот параметр. Низкое значение может вызвать OutOfMemoryException или очень низкую производительность, если объем кучи вашей программы достигает максимального размера кучи. Если ваша программа работает на выделенном сервере, вы можете установить этот параметр выше, поскольку он не повлияет на другие программы.

Аргумент -Xms устанавливает начальный и минимальный объем памяти кучи для JVM. Это означает, что при запуске вашей программы JVM будет выделять этот объем памяти мгновенно. Это полезно, если ваша программа с самого начала потребляет большой объем кучи памяти. Это избавляет JVM от необходимости регулярно увеличивать размер кучи, что позволяет повысить производительность. Если вы не знаете, поможет ли вам этот параметр, не используйте его.

Рекомендуется использовать серверные Java-приложения, такие как Resin, для установки одинакового значения минимального -Xms и максимального -Xmx размеров кучи. Вы можете установить 256 или 512 МБ.

7 голосов
/ 28 ноября 2012

Размер кучи должен быть «правильным» для вашего приложения, чтобы найти правильный, хотя это нелегко. Если он слишком мал, у вас не хватает памяти, если слишком много, вы тратите впустую память и рискуете сделать длинные GC-паузы. Когда что-то идет не так (а они всегда идут не так), чем больше у вас кучи, тем больше кучи нужно отлаживать и тем дольше будут проявляться утечки.

В идеале я бы установил -Xms в качестве размера, который, по моему мнению, должен запускать мое приложение, а -Xmx - в значение, большее, чем это (но не слишком большое). Всегда включайте подробную сборку мусора и составьте график используемой кучи, чтобы проверить значения, которые вы установили.

Когда я рисую кучу, я смотрю на количество коллекций и их тип. Важно не иметь слишком много. Однако также важно не иметь кучу настолько огромную, чтобы их было мало, потому что когда они произойдут (и полный сбор данных неизбежен), они повредят. В идеале ищется регулярный набор хорошо разнесенных gcs с очень малым временем паузы.

При этом для 32-битной Windows -Xms должно быть таким же, как -Xmx, это потому, что Java (оставляя в стороне jrockit) требует непрерывной памяти, а карта памяти Windows фрагментирована, поэтому платит за получение и блокировку кучи, как можно раньше.

2 голосов
/ 29 апреля 2010

Xmx - верхняя граница пула памяти. Xms - это начальный размер. Это все, что нужно. Подходящий размер для каждого будет зависеть от сложности вашего приложения. Основным преимуществом установки начального размера более 2 Мб будет то, что JVM будет тратить меньше времени на запрос большего объема памяти у ОС. Если вы установили верхний предел в 256 Мб, начальный размер 32 Мб-64 Мб будет неоправданным для большинства корпоративных приложений.

Подробнее здесь: http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html

1 голос
/ 29 апреля 2010

Что я должен установить это значение и почему?

Зависит от вашего заявления, конечно.

Если вы знаете, что ваше приложение изначально потребляет до, скажем, 64 МБ в первую минуту, то при использовании значения по умолчанию (2 МБ) память VM будет запрашиваться несколько раз, пока не достигнет 64 МБ. Эти запросы памяти немного замедляют работу вашего приложения, потому что сборщик мусора может запускаться несколько раз, пытаясь освободить место, прежде чем виртуальная машина запросит больше.

Если вы уже знаете, что будете использовать в качестве начальных 64 МБ, использование параметра -Xms позволит вам выделить эту память заранее.

Если вы используете 128 МБ и у вас достаточно памяти, вы можете использовать java -Xms128m и не беспокоиться о том, чтобы запросить дополнительную память в течение длительного времени.

Но, опять же, это зависит от того, что делает ваше приложение, как используется память, когда это необходимо. и т. д.

...