Эргономика JVM

Эргономика - это процесс, с помощью которого виртуальная машина Java (JVM) и эвристика сбора мусора, такие как эвристика на основе поведения, повышают производительность приложений.

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

В этом посте описываются выбор по умолчанию и настройка на основе поведения. Используйте эти значения по умолчанию перед использованием более подробных элементов управления.

Значения по умолчанию для сборщика мусора, кучи и компилятора времени выполнения

  • Сборщик мусора Garbage-First (G1)
  • Максимальное количество потоков GC ограничено размером кучи и доступными ресурсами ЦП.
  • Начальный размер кучи 1/64 физической памяти
  • Максимальный размер кучи 1/4 физической памяти
  • Многоуровневый компилятор, использующий как C1, так и C2

Настройка на основе поведения

Сборщики мусора на виртуальной машине Java HotSpot могут быть сконфигурированы так, чтобы они преимущественно выполняли одну из двух задач: максимальное время паузы или пропускная способность приложения. Если предпочтительная цель достигнута, сборщики постараются максимизировать другую. Естественно, эти цели не всегда могут быть достигнуты: приложениям требуется минимальная куча для хранения как минимум всех оперативных данных, а другая конфигурация может препятствовать достижению некоторых или всех желаемых целей.

Максимальное время паузы

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

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

Максимальное время паузы указывается с помощью параметра командной строки -XX:MaxGCPauseMillis=<nnn>. Это интерпретируется как подсказка сборщику мусора о том, что время паузы составляет миллисекунд или меньше. Сборщик мусора корректирует размер кучи Java и другие параметры, связанные со сборкой мусора, чтобы сделать паузы сбора мусора короче, чем <nnn> миллисекунд. Значение по умолчанию для максимального времени паузы зависит от сборщика. Эти корректировки могут привести к более частому сбору мусора, что снижает общую пропускную способность приложения. В некоторых случаях, однако, желаемая цель времени паузы не может быть достигнута.

Цель по пропускной способности

Цель пропускной способности измеряется с точки зрения времени, затраченного на сбор мусора, а время, проведенное за пределами сбора мусора, является временем применения.

Цель задается параметром командной строки -XX:GCTimeRatio=nnn. Отношение времени сборки мусора ко времени применения составляет 1/(1+nnn). Например, -XX:GCTimeRatio=19 устанавливает цель в 1/20 или 5% от общего времени для сбора мусора.

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

Площадь (Footprint)

Если были достигнуты цели пропускной способности и максимальной продолжительности паузы, то сборщик мусора уменьшает размер кучи до тех пор, пока одна из целей (неизменно цель пропускной способности) не может быть достигнута. Минимальный и максимальный размеры кучи, которые может использовать сборщик мусора, можно установить с помощью -Xms=<nnn> и -Xmx=<mmm> для минимального и максимального размера кучи соответственно.

Стратегия Тюнинга

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

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

Изменение поведения приложения может привести к увеличению или уменьшению кучи. Например, если приложение начинает выделение с более высокой скоростью, куча увеличивается, чтобы поддерживать ту же пропускную способность.

Если размер кучи увеличивается до максимального размера, а цель пропускной способности не достигается, то максимальный размер кучи слишком мал для цели пропускной способности. Установите для максимального размера кучи значение, близкое к общему объему физической памяти на платформе, но не вызывающее использование приложением swap памяти. Запустите приложение еще раз. Если цель по пропускной способности все еще не достигнута, тогда время для приложения слишком велико для доступной памяти на платформе.

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

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки