Yavaş ilk çağrıyı önlemek için java dersleri nasıl ısınır?


13

Ben 1s daha az almak için tüm API çağrıları gereken bir proje yapıyorum ama aşağıdaki yollardan daha yavaş her rotaya ilk çağrı ile ilgili bir sorun yaşıyorum.

Şu anda / login için ilk çağrı 3.6s alır ve bir sonraki çağrı 170ms sürer ve diğer tüm rotalar için aynıdır.

Bunu -XX:+TraceClassLoadingilk çağrıda kullanarak öğrendim , sınıflar belleğe yüklendi ve bu performans sorununa neden oldu.

Ancak başlangıçta tüm sınıfları yüklemenin kolay bir yolunu bulamadım ve her yeni hizmet için bir ApplicationRunner'a bir ısınma çağrısı eklemem gerekiyor.

Herkes SpringBoot uygulamasının sınıflarını otomatik olarak yüklemek veya tüm yollarını ısıtmak için bir çözümü var mı?


Daha fazla ayrıntı ekleyebilir misiniz? Uygulamanız denetleyicileri başlatıyor mu? Yoksa başka hizmetler mi arıyorsunuz? Diğer servislere nasıl çağrı yapıyorsunuz?
Menios

Spring Boot sınıf taramasını yoğun bir şekilde kullanır, bu nedenle masaüstü uygulamasında olduğu gibi herhangi bir şeyi 'ısıtmanıza' gerek yoktur. Bu ilk uzun yükleme, kaynak arama işleminin sonucu olabilir - örneğin sayfa şablonu yükleme.
Alex Chernyshev

Biraz dolaylı bir yaklaşım: uç noktalar için% 100 birim test kapsamına sahipseniz, bunları kullanabilirsiniz. Her uç nokta için kod yazmanız gerekir, ancak bir şey kazanırsınız
Marged

1
Yaptığınız projeye bağlı olarak ideal olmayabilir, ancak uygulamanız yüklendiğinde uç noktalarınızı dahili olarak çağırabilirsiniz.
omoshiroiii

@omoshiroiii Bunda yanlış bir şey yok . biz yapıyoruz. üretimde. Nedeni, kullanan bazı dinamik kütüphanelerle ilgilidir invokedynamicve bizler için ilk çağrıda çözünürlüğün yavaş olduğunu biliyoruz (bu ilk çağrı olmadan onlarca saniye biriken on binlerce çağrı var).
Eugene

Yanıtlar:


1

Java'nın sınıf yüklemesi tembeldir. Bu, bir sınıfın yalnızca gerektiğinde ve gerektiğinde JVM tarafından yüklendiği anlamına gelir.

Sınıfları hevesle yüklemeye zorlamak istiyorsanız, sadece bunlara başvurmanız gerekir. Bunu yapmanın bir yolu, sınıf adlarını almak için jar içeriğini veya sınıf dosyalarını yinelemek ve daha sonra bunları aramak için kullanmaktır Class.forName(className).

Ayrıca, başlangıç ​​zamanı ve performans kullanım durumunuz için çok önemliyse, GraalVM gibi önceden derleme çözümlerine bakmak veya JIT'in derleme eşiğini ( -XX:CompileThreshold) azaltmak isteyebilirsiniz .


bunların hiçbiri OP'nin problemini çözmez. GraalVM'de yükleme hala tembeldir ve ilk çağrılarda JITanlamsızdır .
Eugene

ayrıca, GraalVMiyi, ama lütfen github'daki sorunların sayısına bir göz atın: bir sandbox projesinden daha büyük bir şeye geçtiğinizde (esas olarak yansımaya bakıyorum), biraz acı çekeceksiniz, en azından. Demek istediğim: GraalVM'ye geçmek parmakların basit bir parçası değil.
Eugene

Sınıfları kavanoza yüklemeyi düşündüm ama bunu yapmanın bir yolunu bulamadım, bir örnek olur muydunuz?
Ybri

@Eugene Cevabımı okursanız GraalVM veya JIT eşiğinin sınıf yüklemesinin tembelliğini değiştireceğini söylemediğimi göreceksiniz. OP'nin tembellik ile ilgili sorusunun cevabı, ondan önceki paragraftır. OP'nin başlangıç ​​zamanını / performansını sınıf yüklemesinin ötesinde daha da optimize etmesi gerektiğinde, son paragraf ek bir ipucudur.
andresp

1
@Ybri burada yanıtları olan başka sorular da var, örneğin stackoverflow.com/questions/2370867/…
andresp

0

Bana göre, sahip olabileceğiniz tek seçenek JEP 310 , JEP 341 ve JEP 350'yeclass data sharing yayılmış , ancak bu muhtemelen java-13'ü gerektiriyor. Bunu dahili olarak işyerimde test ediyoruz (çoğunlukla eğlence için, yalan söylemeyeceğiz) ve sonuçlar şimdiye kadar iyi görünüyor.

Diğer seçenek, uygulama başladığında uç noktalarınızı çağırmaktır - bu bir seçenekse. Yine, bir örnek bizim için: Biz kodunu ısınmak için taklit veriler yüzlerce kez birkaç diyoruz. Ama aynı zamanda bunun imkansız olacağı hizmetlere sahibiz - bu yüzden de keşfetme CDS.


Üretim veritabanınızda veri oluşturulmasını önlemek için kimlik doğrulamayı ve post uç noktalarını nasıl ele alırsınız?
Ybri

@Ybri tam olarak neden söyledim, bazıları için imkansız .
Eugene
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.