Як розігріти заняття java, щоб уникнути повільного першого дзвінка?


13

Я роблю проект, де мені потрібно, щоб усі дзвінки API взяли менше 1 секунди, але я зіткнувся з проблемою, коли перший дзвінок кожного маршруту відбувається повільніше, ніж наступний.

Наразі перший виклик / вхід займає 3,6 секунди, а наступний - 170 мс і стільки ж для всіх інших маршрутів.

Я дізнався, використовуючи -XX:+TraceClassLoadingце під час першого дзвінка, класи завантажувались у пам'ять, і це спричиняло проблеми з продуктивністю.

Однак я не знайшов простий спосіб завантаження всіх класів при запуску, і для кожної нової послуги мені потрібно додати розминку для розминки в ApplicationRunner.

Хтось має рішення автоматично завантажувати класи програми SpringBoot або прогрівати всі його маршрути?


Чи можете ви додати більше деталей? Чи є у вашій програмі екземпляри контролерів? Або ви телефонуєте іншим службам? Як здійснюєте дзвінки в інші служби?
Меніос

Spring Boot інтенсивно використовує сканування класу, тому вам не потрібно «розігрівати» нічого, як у настільних додатках. Це тривале початкове завантаження може бути результатом пошуку ресурсів - наприклад, завантаження шаблонів сторінки.
Олексій Чернишев

Трохи непрямого підходу: якщо у вас є 100% тестового покриття для кінцевих точок, ви можете їх використовувати. Вам все одно доведеться
кодувати

1
Можливо, це не ідеально залежно від проекту, яким ви займаєтесь, але ви можете зателефонувати до своїх кінцевих точок, коли завантажується ваша програма.
omoshiroiii

@omoshiroiii в цьому немає нічого поганого. ми це робимо. у виробництві. причина пов'язана з деякими динамічними бібліотеками, які використовують, invokedynamicі ми знаємо, що роздільна здатність у першому дзвінку повільна (для них є десятки тисяч таких дзвінків, які без цього першого дзвінка накопичуються до десятків секунд).
Євген

Відповіді:


1

Навантаження класу Java - лінива. Це означає, що клас завантажується JVM лише тоді, коли це потрібно і якщо потрібно.

Якщо ви хочете змусити його охоче завантажувати класи, вам просто потрібно посилатися на них. Один із способів зробити це - переглядати вміст jar або файли класу, щоб отримати назви класів, а потім використовувати їх для виклику Class.forName(className).

Крім того, якщо час запуску та продуктивність дуже важливі для вашої справи використання, ви можете заздалегідь вивчити компіляційні рішення, такі як GraalVM , або зменшити поріг JIT для компіляції ( -XX:CompileThreshold).


жоден із них не вирішить проблему ОП. завантаження все ще ледаче в GraalVM і не JITмає сенсу на перших викликах, насправді.
Євген

також, GraalVMце добре, але, будь ласка, подивіться на кількість питань, які він має в github: як тільки ви перейдете від проекту пісочниці до чогось більшого (я в основному дивлюся на вас роздуми), ви будете відчувати біль, принаймні. моя думка: заміна на GraalVM - це не простий оснащення пальців.
Євген

Я думав над завантаженням класів у банку, але не знайшов способу це зробити, чи є у вас приклад?
Ібрі

@Eugene, якщо ви прочитаєте мою відповідь, ви побачите, що я не сказав, що GraalVM або поріг JIT змінить лінивість завантаження класу. Відповідь на запитання ОП щодо ледачості - абзац перед цим. Останній абзац є лише додатковою порадою у випадку, якщо ОП потребує подальшої оптимізації часу / продуктивності запуску після завантаження класу.
andresp

1
@Ybri є інші питання з відповідями на що тут, наприклад , stackoverflow.com/questions/2370867 / ...
andresp

0

Для мене єдиний життєздатний варіант - це class data sharingрозповсюдження JEP 310 , JEP 341 та JEP 350 , але для цього потрібен java-13. Ми тестуємо це всередині мого робочого місця (в основному для задоволення, не брехати), і результати виглядають непогано, поки що.

Інший варіант - виклик ваших кінцевих точок при запуску програми - якщо це варіант. Знову ж , це для нас, наприклад: ми називаємо їх фіктивними даними пару сотень разів , щоб розігріти код. Але в той же час у нас є сервіси, де це було б неможливо - саме тому і вивчення CDS.


Як ви обробляєте аутентифікацію та кінцеві точки, щоб уникнути створення даних у виробничій базі даних?
Ібрі

@Ybri саме тому, що я сказав, для деяких неможливо .
Євген
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.