Прогрев приложений Java с высокой пропускной способностью
-
20-09-2019 - |
Вопрос
Недавно я узнал о сценариях, которые требуют прогрева приложения (с высокими требованиями к пропускной способности), прежде чем они начнут обслуживать реальные запросы.Логика, стоящая за этим, заключалась в том, чтобы позволить JIT творить чудеса производительности!
Является ли это нормой для приложений Java или это обычно делается для приложений с большим объемом памяти?
Решение
Если вы говорите о веб-приложении / веб-сайте с высоким трафиком, то JIT - это очень незначительная проблема.Самая большая проблема заключается в прогреве (заполнении) всех слоев кэша, которые вам понадобятся.Например, области ehcache, которые заполняются из спящего режима.Это потому, что операции, связанные с вводом-выводом, на порядки медленнее, чем все, что происходит внутри процессора (если только вы не вычисляете фракталы :)
Другие советы
Вопрос в том, когда бы вы хотели уйди со своего пути чтобы сделать это?
Если вы запускаете веб-приложение и оно СРАЗУ же запускается в режиме реального времени, то, пока вы его "прогреваете", вы добавляете дополнительную нагрузку, что контрпродуктивно.Аналогично обстоит дело и при запуске настольного приложения.Нет смысла подогревать, если пользователь собирается немедленно начать им пользоваться.Или, что еще хуже, не позволяя пользователю взаимодействовать, пока вы прогреваете приложение.
Если вы развертываете веб-приложение и тестируете развертывание перед тем, как направить на него свои средства балансировки нагрузки, то вы уже прогрели его в качестве побочного результата.
В дополнение к ответ херувима, Я могу придумать несколько других вопросов, которые требуют разминки:
- Создание экземпляров объектов (отложенная загрузка, синглтоны и т.д.);
- Распределение кучи (если ваш
Xms
меньше, чем вашXmx
).
Я полагаю, что ОС также настраивается на поведение приложения, так что период прогрева также может повлиять на вызовы операционной системы.
Большинство из вышеперечисленных (заполнение кэша, инициализация объекта) не являются специфичными для Java.