Подтвердить что ты не робот

Хорошо ли установить максимальный размер кучи JVM max и min?

В настоящее время в нашей тестовой среде максимальный размер кучи JVM max и min устанавливается в одно и то же значение, в основном столько, сколько выделенный серверный сервер позволит нашему приложению. Является ли это лучшей конфигурацией для производительности или даст JVM диапазон лучше?

4b9b3361

Ответ 1

Основная причина установки -Xms - если вам нужна определенная куча при запуске. (Предотвращает появление ошибок OutOfMemoryErrors при запуске.) Как уже упоминалось выше, если вам нужна куча запуска, чтобы совместить максимальную кучу, вы должны ее сопоставить. В противном случае вам это действительно не нужно. Просто попросит приложение занять больше памяти, что в конечном итоге может понадобиться. Наблюдение за использованием памяти во времени (профилирование) при тестировании нагрузки и использовании вашего приложения должно дать вам хорошее представление о том, что нужно для их установки. Но не хуже, когда они запускают их при запуске. Для многих наших приложений я действительно начинаю с чего-то вроде 128, 256 или 512 за минуту (запуск) и один гигабайт для max (это для приложений приложений не для приложений).

Просто нашел этот вопрос в переполнении стека, который также может быть полезен side-effect-for-increasing-maxpermsize-and-max-heap-size. Стоит посмотреть.

Ответ 2

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

Установка ms == mx эффективно отключает это поведение. Хотя это было хорошей идеей в более старых JVM, это уже не так. Выращивание и сжатие кучи позволяет JVM адаптироваться к увеличению давления на память, но уменьшая время паузы, уменьшая кучу при уменьшении давления памяти. Иногда такое поведение не дает вам преимуществ производительности, которых вы ожидаете, и в таких случаях лучше всего установить mx == ms. OOME вызывается, когда куча превышает 98% времени, затрачиваемого на сбор, и коллекции не могут восстановить больше, чем 2%. Если вы не на максимальном размере кучи, JVM будет просто расти, так что вы выходите за пределы этих границ. У вас не может быть OutOfMemoryError при запуске, если ваша куча не достигает максимального размера кучи и не отвечает другим условиям, которые определяют OutOfMemoryError.

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

size_t desired_size = MAX2(MIN2(eden_plus_survivors, gen_size_limit()),
                           min_gen_size());

Я мог бы больше копаться, но я бы поспорил, что найду код, который выполняет ту же самую цель в реализациях ParNew и PSOldGen и CMS Tenured. На самом деле вряд ли CMS сможет вернуть память, если не было Concurrent Mode Failure. В случае CMF будет запускаться серийный коллектор, который должен включать уплотнение, после которого верхняя часть кучи, скорее всего, будет чистой и, следовательно, может быть освобождена.

Ответ 3

AFAIK, устанавливая оба одинакового размера, устраняет дополнительный шаг изменения размера кучи, который может быть в вашу пользу, если вы в значительной степени знаете, сколько кучи вы собираетесь использовать. Кроме того, наличие большого размера кучи уменьшает вызовы GC до такой степени, что это происходит очень мало. В моем текущем проекте (анализ рисков торгов) наши двигатели риска имеют как Xmx, так и Xms то же значение, которое довольно велико (около 8Gib). Это гарантирует, что даже после целого дня вызова двигателей почти не происходит GC.

Кроме того, я нашел интересное обсуждение здесь.

Ответ 4

Определенно yes для серверного приложения. Какой смысл иметь столько памяти, но не использовать ее? (Нет, это не экономит электроэнергию, если вы не используете ячейку памяти)

JVM любит память. Для данного приложения, чем больше JVM памяти, тем меньше он выполняет GC. Лучшая часть - больше объектов, умрет молодым и меньше будет владеть.

Особенно при загрузке сервера загрузка еще выше, чем обычно. Это мозг мертв, чтобы дать серверу небольшую память для работы на этом этапе.

Ответ 5

Из того, что я вижу здесь, в http://java-monitor.com/forum/showthread.php?t=427 тестируемый JVM начинается с установки Xms, но WILL освобождает память, в которой она не нужна, и она будет соответствовать значению Xmx, когда это необходимо.

Если вам не понадобится кусок памяти, предназначенный для потребителя большой памяти, вначале не так много смысла в установке высокого Xms = Xmx. Похоже, что освобождение и распределение происходят даже с Xms = Xmx