Realizuję projekt, w którym potrzebuję wszystkich wywołań interfejsu API, aby trwały krócej niż 1s, ale mam problem z pierwszym wywołaniem każdej trasy, który jest wolniejszy niż kolejne.
Obecnie pierwsze połączenie z logowaniem trwa 3,6 sekundy, a kolejne 170 ms i tak samo dla wszystkich pozostałych tras.
Dowiedziałem się, -XX:+TraceClassLoading
że przy pierwszym wywołaniu klasy zostały załadowane do pamięci, co spowodowało problem z wydajnością.
Jednak nie znalazłem łatwego sposobu na załadowanie wszystkich klas podczas uruchamiania i do każdej nowej usługi muszę dodać wywołanie rozgrzewające w ApplicationRunner.
Czy ktoś ma rozwiązanie, aby automatycznie załadować klasy aplikacji SpringBoot lub rozgrzać wszystkie jej trasy?
invokedynamic
i wiemy, że rozdzielczość przy pierwszym wywołaniu jest powolna (mamy dziesiątki tysięcy takich wywołań, które bez tego pierwszego połączenia kumulują się do dziesiątek sekund).Odpowiedzi:
Ładowanie klasy Java jest leniwe. Oznacza to, że klasa jest ładowana przez JVM tylko wtedy, gdy jest to konieczne i jeśli jest to konieczne.
Jeśli chcesz zmusić go do niecierpliwego ładowania klas, musisz po prostu do nich odwoływać. Jednym ze sposobów jest iteracja zawartości jar lub plików klas, aby uzyskać nazwy klas, a następnie użyć ich do wywołania
Class.forName(className)
.Dodatkowo, jeśli czas uruchamiania i wydajność są bardzo ważne w twoim przypadku użycia, możesz chcieć przyjrzeć się rozwiązaniom kompilacji przed czasem, takim jak GraalVM , lub zmniejszyć próg JIT dla kompilacji (
-XX:CompileThreshold
).źródło
JIT
nie ma znaczenia przy pierwszych wywołaniach, naprawdę.GraalVM
jest dobre, ale proszę spojrzeć na liczbę problemów, które ma w github: jak tylko przejdziesz z projektu piaskownicy do czegoś większego (głównie patrzę na twoje odbicie), będziesz odczuwał ból, przynajmniej. Chodzi mi o to: przejście na GraalVM nie jest zwykłym pstryknięciem palców.Dla mnie jedyną realną opcją masz to
class data sharing
, rozłożone JEP 310 , JEP 341 i JEP 350 , ale to wymaga java-13 najprawdopodobniej. Testujemy to wewnętrznie w moim miejscu pracy (głównie dla zabawy, nie będę kłamać), a wyniki do tej pory wyglądają dobrze.Inną opcją jest wywoływanie punktów końcowych podczas uruchamiania aplikacji - jeśli jest to opcja. Ponownie, jest to dla nas na przykład: nazywamy je z danymi atrapy kilka setek razy, aby rozgrzać kod. Ale jednocześnie mamy usługi, w których byłoby to niemożliwe - dlatego też odkrywanie
CDS
.źródło