Java Garbage Collection на облачном хостинге Infobox Jelastic

в 7:25, , рубрики: infobox, java, java ee, jelastic, Блог компании Infobox, облачный хостинг, Программирование

Производительность и цена – это два основных, наиболее значимых фактора в хостинге приложений. Мы часто спрашиваем себя, как тратить меньше, не ухудшая производительности приложений. В данной статье мы рассмотрим автоматическое управление памятью для Java-приложений, размещенных на облачном хостинге Infobox Jelastic с использованием сборки мусора и Jelastic GC Agent. В конце статьи небольшой сюрприз.

Для начала определим, что такое сборка мусора и что она делает для нашего Java-приложения. Затем поговорим подробнее от процессах сборки мусора в Jelastic.

Сборка мусора в Java: матчасть

Сборка мусора (Garbage Collection, GC) представляет собой форму автоматического управления памятью. Ее целью является поиск объектов в памяти, которые больше не нужны приложениям и освобождения занятого ими места для дальнейшего использования.

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

Infobox Jelastic reduce costs

Настройки GC в Jelastic по умолчанию

Если пользователем не указаны свои настройки, Jelastic настроит сборщик мусора следующим образом:

  • ParNew для всех серверов с лимитом ресурсов менее 8 ГБ;
  • G1 для серверов с лимитом ресурсов более 8 ГБ (64 клаудлета и более).

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

Infobox Jelastic Scaling Limit

Сборщик мусора ParNew

ParNew – «stop the world» многопоточный сборщиком мусора. Он собирает молодое поколение объектов. Поскольку молодое поколение обычно небольшого размера, в Jelastic этот сборщик используется только для серверов с лимитом ресурсов менее 8 ГБ. Сборка, основанная на размере объектов работает очень быстро и незначительно влияет на функционирование вашего приложения. К тому же, сборщик ParNew умеет освобождать неиспользуемую память, что позволяет корректно работать вертикальному автомасштабированию — одной из основных функций Jelastic.

Сборщик мусора Garbage–First

Garbage-First (G1) – сборщик мусора серверного типа для многопроцессорных машин с большим объемом памяти. Куча (Heap) разделяется на области фиксированного размера и G1 отслеживает живые данные в этих областях. Когда необходима сборка мусора, gc начинает с областей с меньшим количеством живых данных.

G1 сфокусирован на приложениях, которым нужен большой объем кучи с ограниченными задержками при сборке мусора. После глубокого анализа, мы пришли к выводу, что 8 ГБ потребляемой памяти достаточно для применения G1.

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

Кастомизация настроек GC в Jelastic

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

Вы можете выставить свои параметры сборки мусора (GC) на основании требований вашего приложения:

  • отредактировав файл variables.conf вашего сервера Tomcat, TomEE или Jetty
  • изменив настройки JVM в панели администрирования сервера GlassFish

1. Чтобы настроить Tomcat, TomEE или Jetty откройте конфигурационные файлы вашего Java-сервера.

Java Garbage Collection на облачном хостинге Infobox Jelastic

2. Перейдите к файлу server > variables.conf.

Java Garbage Collection на облачном хостинге Infobox Jelastic

3. В открытом файле variables.conf вы можете указать необходимый сборщик мусора, установив в качестве параметра GC одно из следующих значений:

-XX:+UseParNewGC
-XX:+UseG1GC
-XX:+UseConcMarkSweepGC
-XX:+UseSerialGC

4. При настройке GlassFish, вам следует использовать такой же формат параметра GC.
Откройте админ-панель GlassFish, перейдите в раздел Configurations > gfcluster-config > JVM Settings > JVM Options и отредактируйте соответствующую строку, как показано на картинке ниже.

Java Garbage Collection на облачном хостинге Infobox Jelastic

5. После этого при запуске вашего Java сервера будет использоваться только указанный вами сборщик мусора вне зависимости от выделенных ресурсов.

Обратите внимание, что GC агент Jelastic работает только с двумя типами сборщиков мусора:

-XX:+UseParNewGC</li>
-XX:+UseG1GC</li>

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

6. Также вы можете уменьшить использование сборщиком мусора процессорной мощности и контролировать, как именно JVM использует память кучи. Для этого вам нужно настроить частоту запуска сборки мусора, указав параметры -Xmx и -Xms.

Параметр -Xmx используется, чтобы запустить JVM с большим максимальным объемом кучи и освободить процессорное время для важных процессов.

Параметр -Xms гарантирует, что начальный размер кучи памяти JVM равен максимальному выделенному лимиту памяти (лимиту масштабирования).

Эти параметры должны быть указаны в файле variables.conf для Tomcat, TomEE и Jetty или в настройках JVM для GlassFish.

-Xmx<размер>m
-Xms<размер>m

Java Garbage Collection на облачном хостинге Infobox Jelastic

Агент сборки мусора Jelastic

Освобождение зарезервированной, но в то же время не используемой JVM памяти в ОС необходимо для вертикального автомасштабирования. Поэтому Jelastic использует специальный агент сборки мусора.

GC агент Jelastic включает с себя интеллектуальный алгоритм для наблюдения за потребляемой и свободной памятью. Обрабатывая результаты мониторинга, он распознает возможность освободить часть памяти для ОС и запускает полную сборку мусора. Если у JVM нет свободной памяти, которую можно освободить для ОС, GC агент Jelastic не запускает полную сборку мусора. Этот подход потенциально может снизить деградацию производительности приложения до нуля.

GC агент Jelastic работает только для двух типов сборщиков мусора (настроенных в Jelastic по умолчанию):

-XX:+UseParNewGC
-XX:+UseG1GC

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

Для настройки GC агента Jelastic, перейдите к файлу server > variables.conf для Tomcat, TomEE или Jetty сервера.

Java Garbage Collection на облачном хостинге Infobox Jelastic

Для GlassFish GC агент Jelastic может быть настроен или отключен через панель администрирования GlassFish в разделе gfcluster-config > JVM Settings > JVM Options.

Java Garbage Collection на облачном хостинге Infobox Jelastic

Включение/Выключение GC агента Jelastic

GC агент Jelastic по умолчанию включен для всех вновь созданных серверов Java-приложений.

Если вы хотите включить GC агент Jelastic в уже существующем контейнере, вам следует загрузить файл jelastic-gc-agent.jar и включите агент вручную следующим образом:
1. Скачайте файл jelastic-gc-agent.jar.
2. Перейдите к конфигурационным файлам вашего Java сервера и загрузите скачанный .jar файл в папку home.

Java Garbage Collection на облачном хостинге Infobox Jelastic

3. Перейдите к файлу server > variables.conf и укажите путь к вашему файлу jelastic-gc-agent.jar в параметре -javaagent.
Путь зависит от используемого вами сервера Java:

  • Tomcat/TomEE: /opt/tomcat/temp
  • GlassFish: /opt/glassfish3/temp
  • Jetty: /opt/jetty/home

4. Сохраните изменения и перезапустите сервер.

Если вы заметили, что процессы GC агента Jelastic вызвали деградацию производительности для вашего приложения, закомментируйте следующую строку и перезапустите сервер:
-javaagent:/var/lib/jelastic/java/jelastic-gc-agent.jar

Изменение периода проверок

По умолчанию GC агент Jelastic проводит проверку системы каждые 15 минут (начиная с каждого запуска JVM) для принудительного освобождения неиспользуемой приложением памяти. Период проверки может быть изменен согласно вашим потребностям.

Для изменения периода проверки, укажите время между запусками полной сборки мусора в секундах, как показано ниже:

-javaagent:/var/lib/jelastic/java/jelastic-gc-agent.jar=period=900

Java Garbage Collection на облачном хостинге Infobox Jelastic

Для применения изменений, сохраните файл и перезапустите сервер.

Включение режима отладки

Вы можете включить режим отладки следующим образом:

-javaagent:/var/lib/jelastic/java/jelastic-gc-agent.jar=debug=true

В результате вы сможете отслеживать процессы логах GC.

Обратите внимание, что вы можете использовать обе опции (изменение периода проверки и включение режима отладки) вместе:

-javaagent:/var/lib/jelastic/java/jelastic-gc-agent.jar=debug=true,period=900

Java Garbage Collection на облачном хостинге Infobox Jelastic

Сохраните изменения и перезапустите сервер.

Проверка результатов сборки мусора

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

1. Перейдите по ссылке и скачайте архив Loader.war с тестовым приложением.

2. Загрузите этот .war архив на Jelastic.

3. Разверните это приложение в окружениe с Java-приложенем.

4. Откройте конфигурационные файлы и перейдите к файлу server > variables.conf чтобы проверить настройки Java агента Jelastic.

Java Garbage Collection на облачном хостинге Infobox Jelastic

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

5. После этого откройте приложение в браузере и добавьте следующие параметры к ссылке:
/loader?mem=500&duration=300

Java Garbage Collection на облачном хостинге Infobox Jelastic

Java Garbage Collection на облачном хостинге Infobox Jelastic

Java Garbage Collection на облачном хостинге Infobox Jelastic
6. Теперь вы можете перейти к Статистике, где, через некоторое время, вы увидите результаты.

Java Garbage Collection на облачном хостинге Infobox Jelastic

Когда вы выполнили запрос приложения с параметрами, добавленными к ссылке, потребление памяти возрастает на 500 МБ. Это количество памяти будет использоваться в течение 300 секунд (также в соответствие с указанным параметром).

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

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

Java Garbage Collection на облачном хостинге Infobox Jelastic

7. Поскольку мы включили режим отладки для нашего Java агента, мы также можем отследить процесс в Log файлах.

Java Garbage Collection на облачном хостинге Infobox Jelastic

Объем доступной свободной памяти (в байтах) можно посмотреть в логах catalina.

Java Garbage Collection на облачном хостинге Infobox Jelastic

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

300 рублей на Jelastic в подарок!

Всем, дочитавшим до конца статьи, даем по 300 рублей на ваш аккаунт Jelastic. Зарегистрируйтесь в пробной версии, после окончания триала нажмите на кнопку «Переход на платную версию» в Jelastic, заполните данные о себе и пришлите ваш логин на trukhinyuri@infoboxcloud.com.

Успешного использования Jelastic в Infobox и отличного настроения!

Автор: infobox

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js