Я делаю проект, где мне нужно, чтобы все вызовы API занимали меньше 1 с, но я сталкиваюсь с проблемой с первым вызовом на каждый маршрут, который медленнее, чем следующие.
В настоящее время первый вызов / вход в систему занимает 3,6 с, а следующие - 170 мс и то же самое для всех остальных маршрутов.
Я обнаружил, -XX:+TraceClassLoading
что при первом вызове классы были загружены в память, что вызвало проблему с производительностью.
Однако я не нашел простого способа загрузки всех классов при запуске, и для каждого нового сервиса мне нужно добавить разогревающий вызов в ApplicationRunner.
У кого-нибудь есть решение для автоматической загрузки классов приложения SpringBoot или прогрева всех его маршрутов?
invokedynamic
и мы знаем, что разрешение при первом вызове для них медленное (у нас есть десятки тысяч таких вызовов, которые без этого первого вызова накапливаются до десятков секунд).Ответы:
Загрузка классов Java ленива. Это означает, что класс загружается JVM только тогда, когда это необходимо и если это необходимо.
Если вы хотите принудительно загружать классы, вам просто нужно сослаться на них. Один из способов сделать это - перебирать содержимое jar или файлы классов, чтобы получить имена классов, а затем использовать их для вызова
Class.forName(className)
.Кроме того, если время запуска и производительность очень важны для вашего варианта использования, вы можете заранее рассмотреть решения для компиляции, такие как GraalVM , или уменьшить порог JIT для компиляции (
-XX:CompileThreshold
).источник
JIT
бессмысленна при первых вызовах .GraalVM
это хорошо, но, пожалуйста, взгляните на число проблем, которые он имеет в github: как только вы перейдете от проекта песочницы к чему-то большему (я смотрю на ваше отражение, в основном), вам будет немного больно, по крайней мере. моя точка зрения: переключиться на GraalVM - это не просто щелчок пальцами.Для меня единственный жизнеспособный вариант, который у вас есть
class data sharing
, это распространение по JEP 310 , JEP 341 и JEP 350 , но для этого, скорее всего, требуется java-13. Мы проводим внутреннее тестирование на моем рабочем месте (в основном для развлечения, а не для того, чтобы лгать), и результаты пока выглядят неплохо.Другой вариант - вызов конечных точек при запуске приложения - если это вариант. Опять же , это для нас, например: мы называем их фиктивными данными пару сотен раз , чтобы разогреть код. Но, в то же время, у нас есть сервисы, где это было бы невозможно - вот почему их
CDS
тоже исследуют .источник