Saya sedang melakukan proyek di mana saya membutuhkan semua panggilan API untuk mengambil kurang dari 1 tetapi saya menghadapi masalah dengan panggilan pertama untuk setiap rute yang lebih lambat dari yang berikut.
Saat ini panggilan pertama ke / masuk membutuhkan 3,6s dan yang berikutnya mengambil 170ms dan sama untuk semua rute lainnya.
Saya menemukan menggunakan -XX:+TraceClassLoading
itu pada panggilan pertama, kelas dimuat dalam memori dan yang menyebabkan masalah kinerja.
Namun saya tidak menemukan cara mudah untuk memuat semua kelas saat memulai dan untuk setiap layanan baru, saya perlu menambahkan panggilan pemanasan dalam ApplicationRunner.
Adakah yang punya solusi untuk memuat kelas aplikasi SpringBoot secara otomatis atau menghangatkan semua rutenya?
invokedynamic
dan kami tahu resolusi lambat pada panggilan pertama untuk mereka (kami memiliki puluhan ribu panggilan seperti itu, yang tanpa panggilan pertama ini terakumulasi hingga puluhan detik).Jawaban:
Pemuatan kelas Java malas. Ini berarti kelas hanya dimuat oleh JVM ketika perlu dan jika perlu.
Jika Anda ingin memaksanya memuat kelas dengan bersemangat, Anda hanya perlu merujuknya. Salah satu cara untuk melakukannya adalah dengan menelusuri isi tabung atau file kelas untuk mendapatkan nama kelas dan kemudian menggunakannya untuk menelepon
Class.forName(className)
.Selain itu, jika waktu dan kinerja startup sangat penting untuk kasus penggunaan Anda, Anda mungkin ingin melihat ke depan dari solusi kompilasi seperti GraalVM , atau mengurangi ambang JIT untuk kompilasi (
-XX:CompileThreshold
).sumber
JIT
tidak ada artinya pada doa pertama , sungguh.GraalVM
bagus, tapi tolong lihat sejumlah masalah yang ada di github: segera setelah Anda beralih dari proyek kotak pasir ke sesuatu yang lebih besar (saya melihat refleksi Anda, terutama), Anda akan merasa sakit, paling sedikit. maksud saya adalah: bertukar ke GraalVM bukanlah menjentikkan jari.Bagi saya, satu-satunya pilihan yang Anda miliki adalah
class data sharing
, tersebar di JEP 310 , JEP 341 dan JEP 350 , tetapi ini mungkin membutuhkan java-13. Kami menguji ini secara internal di tempat kerja saya (kebanyakan untuk bersenang-senang, tidak akan berbohong) dan hasilnya terlihat bagus, sejauh ini.Opsi lainnya adalah memanggil titik akhir Anda ketika aplikasi dimulai - jika itu merupakan opsi. Sekali lagi, itu adalah untuk kita misalnya: kita sebut mereka dengan data dummy beberapa ratusan kali untuk pemanasan kode. Tetapi, pada saat yang sama, kami memiliki layanan di mana ini tidak mungkin - itu sebabnya penjelajahan
CDS
juga.sumber