Java-Xms эффекты начального размера - PullRequest
28 голосов
/ 28 марта 2010

Какая польза от установки параметра -Xms и увеличения первоначальной памяти, например, до вычисленной по умолчанию (в моем случае 64 МБ, в соответствии с настройкой Java GC: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html#par_gc.ergonomics.default_size)?

Кроме того, есть ли смысл устанавливать как исходную, так и максимальную память одинакового размера?

Спасибо.

Ответы [ 4 ]

32 голосов
/ 28 марта 2010

Преимущество заключается в том, что производительность снижается, если вы используете достаточно кучи, чтобы ее размер был изменен. Если вы изначально установили его на 64 МБ, но оказалось, что вашему приложению под нагрузкой нужны 250 МБ, то, когда вы достигнете значения около 64 МБ, JVM выделит больше пространства кучи и, возможно, будет перемещаться по некоторым объектам и вести другой учет. Это, конечно, требует времени.

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

Иногда при использовании приложения на Java вы увидите инструкции типа «установите Xms и Xmx на одно и то же значение». Это сделано для того, чтобы вообще избежать изменения размера, чтобы ваше приложение запускалось с уже такой большой кучей, какой он когда-либо будет.

6 голосов
/ 28 марта 2010

Связанная статья объясняет это достаточно ясно:

Значения по умолчанию: -Xms 3670k -Xmx 64m [...] Большие серверные приложения часто испытывают две проблемы с этими значениями по умолчанию.Один из них - медленный запуск, потому что начальная куча мала и должна быть изменена во многих основных коллекциях.Более насущная проблема заключается в том, что максимальный размер кучи по умолчанию неоправданно мал для большинства серверных приложений.Практические правила для серверных приложений:

  1. Если у вас нет проблем с паузами, попробуйте выделить виртуальной машине как можно больше памяти.Размер по умолчанию (64 МБ) часто слишком мал.
  2. Установка -Xms и -Xmx на одно и то же значение повышает предсказуемость, удаляя наиболее важное решение по размеру с виртуальной машины.Однако виртуальная машина не сможет компенсировать это, если вы сделаете плохой выбор.
  3. Как правило, увеличивайте объем памяти по мере увеличения числа процессоров, поскольку распределение может быть распараллелено.

Вас также может заинтересовать это обсуждение изпроблема.

4 голосов
/ 28 марта 2010

Какая польза от установки параметра -Xms и увеличения первоначальной памяти, например, до значения по умолчанию

Если начальная куча мала и должна быть изменена во многих основных коллекциях, запуск будет медленным.

Кроме того, есть ли смысл устанавливать как исходную, так и максимальную память одинакового размера?

Установка -Xms и -Xmx на одно и то же значение обеспечивает предсказуемость. Это особенно важно при определении размера JVM во время настройки производительности. Но JVM не сможет компенсировать любое плохое решение.

Я склонен использовать те же значения для производственных серверов (которые настраиваются во время тестирования производительности).

3 голосов
/ 28 марта 2010

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

В производственной системе я считаю целесообразным установить Xms и Xmx на одно и то же значение. По сути, он говорит: «Это объем кучи памяти, которую может получить виртуальная машина, и я сразу же посвящаю ее».

...