Daripada struktur monolitik kepada dunia sistem teragih, pembangunan aplikasi telah berjalan jauh. Penggunaan besar-besaran pengkomputeran awan dan seni bina perkhidmatan mikro telah mengubah pendekatan dengan ketara tentang cara aplikasi pelayan dicipta dan digunakan. Daripada pelayan aplikasi gergasi, kami kini mempunyai perkhidmatan bebas yang digunakan secara individu yang beraksi
apabila diperlukan.
Walau bagaimanapun, pemain baharu pada blok yang boleh memberi kesan kepada kelancaran fungsi ini mungkin 'bermula dingin.' Sejuk bermula apabila permintaan pertama memproses pada pekerja yang baru dilahirkan. Keadaan ini memerlukan pemulaan masa jalan bahasa dan pemulaan konfigurasi perkhidmatan sebelum memproses permintaan sebenar. Ketidakpastian dan pelaksanaan yang lebih perlahan yang dikaitkan dengan permulaan sejuk boleh melanggar perjanjian tahap perkhidmatan perkhidmatan awan. Jadi, bagaimanakah seseorang mengatasi kebimbangan yang semakin meningkat ini?
Untuk memerangi ketidakcekapan permulaan sejuk, pendekatan baru telah dibangunkan melibatkan analisis titik ke, permulaan aplikasi pada masa bina, tangkapan timbunan dan kompilasi (AOT) lebih awal. Kaedah ini beroperasi di bawah andaian dunia tertutup, memerlukan semua kelas Java ditetapkan dan boleh diakses pada masa binaan. Semasa fasa ini, analisis titik-ke yang komprehensif menentukan semua elemen program yang boleh dicapai (kelas, kaedah, medan) untuk memastikan bahawa hanya kaedah Java yang penting dikompilasi.
Kod permulaan untuk aplikasi boleh dilaksanakan semasa proses binaan dan bukannya pada masa jalan. Ini membolehkan pra-peruntukan objek Java dan pembinaan struktur data yang kompleks, yang kemudiannya disediakan pada masa jalan melalui "timbunan imej". Timbunan imej ini disepadukan dalam boleh laku, menyediakan ketersediaan segera apabila aplikasi dimulakan. Yang
pelaksanaan berulang bagi analisis titik ke dan tangkapan gambar diteruskan sehingga keadaan stabil (titik tetap) dicapai, mengoptimumkan kedua-dua masa permulaan dan penggunaan sumber.
Input untuk sistem kami ialah Java bytecode, yang boleh berasal daripada bahasa seperti Java, Scala atau Kotlin. Proses ini memperlakukan aplikasi, perpustakaannya, JDK dan komponen VM secara seragam untuk menghasilkan boleh laku asli khusus untuk sistem pengendalian dan seni bina—disebut sebagai "imej asli". Proses pembinaan termasuk analisis titik lelaran dan petikan timbunan sehingga titik tetap dicapai, membolehkan aplikasi mengambil bahagian secara aktif melalui panggilan balik berdaftar. Langkah-langkah ini secara kolektif dikenali sebagai proses binaan imej asli (Rajah 1)
Rajah 1 – Proses Binaan Imej Asli(sumber: redhat.com)
Kami menggunakan analisis mata untuk memastikan kebolehcapaian kelas, kaedah dan medan semasa masa jalan. Analisis titik-ke bermula dengan semua titik masuk, seperti kaedah utama aplikasi, dan secara berulang merentasi semua kaedah boleh dicapai secara transitif sehingga mencapai titik tetap(Rajah 2).
Rajah 2 – Titik-untuk-analisis
Analisis point-to kami memanfaatkan bahagian hadapan pengkompil kami untuk menghuraikan kod bait Java ke dalam perwakilan perantaraan peringkat tinggi pengkompil (IR). Selepas itu, IR diubah menjadi graf aliran jenis. Dalam graf ini, nod mewakili arahan yang beroperasi pada jenis objek, manakala tepi menunjukkan tepi penggunaan terarah antara nod, menunjuk dari definisi kepada penggunaan. Setiap nod mengekalkan keadaan jenis, yang terdiri daripada senarai jenis yang boleh mencapai maklumat nod dan ketiadaan. Keadaan jenis merambat melalui tepi penggunaan; jika keadaan jenis nod berubah, perubahan ini disebarkan kepada semua penggunaan. Yang penting, keadaan jenis hanya boleh berkembang; jenis baharu boleh ditambahkan pada keadaan jenis, tetapi jenis sedia ada tidak pernah dialih keluar. Mekanisme ini memastikan bahawa
analisis akhirnya menumpu kepada titik tetap, membawa kepada penamatan.
Analisis mata kepada membimbing pelaksanaan kod permulaan apabila ia mencecah titik tetap setempat. Kod ini menemui asalnya dalam dua sumber yang berasingan: Pemula kelas dan kelompok kod tersuai yang dilaksanakan pada masa binaan melalui antara muka ciri:
Pemula Kelas: Setiap kelas Java boleh mempunyai pemula kelas yang ditunjukkan oleh kaedah
Panggil Balik Eksplisit: Pembangun boleh melaksanakan kod tersuai melalui cangkuk yang disediakan oleh sistem kami, melaksanakan sebelum, semasa atau selepas peringkat analisis.
Berikut ialah API yang disediakan untuk disepadukan dengan sistem kami.
boolean isReachable(Class<?> clazz); boolean isReachable(Field field); boolean isReachable(Executable method);
Untuk maklumat lanjut, rujuk QueryReachabilityAccess
void registerReachabilityHandler(Consumer<DuringAnalysisAccess> callback, Object... elements); void registerSubtypeReachabilityHandler(BiConsumer<DuringAnalysisAccess, Class<?>> callback, Class<?> baseClass); void registerMethodOverrideReachabilityHandler(BiConsumer<DuringAnalysisAccess, Executable> callback, Executable baseMethod);
Untuk maklumat lanjut, rujuk BeforeAnalysisAccess
Semasa fasa ini, aplikasi boleh melaksanakan kod tersuai seperti peruntukan objek dan permulaan struktur data yang lebih besar. Yang penting, kod permulaan boleh mengakses keadaan analisis titik ke semasa, membolehkan pertanyaan mengenai kebolehcapaian jenis, kaedah atau medan. Ini dicapai menggunakan pelbagai kaedah isReachable() yang disediakan oleh DuringAnalysisAccess. Dengan memanfaatkan maklumat ini, aplikasi boleh membina struktur data yang dioptimumkan untuk segmen aplikasi yang boleh dicapai.
Akhir sekali, tangkapan timbunan membina graf objek dengan mengikuti penunjuk akar seperti medan statik untuk membina pandangan menyeluruh bagi semua objek yang boleh dicapai. Graf ini kemudian mengisi imej asli
timbunan imej, memastikan bahawa keadaan awal aplikasi dimuatkan dengan cekap semasa dimulakan.
Untuk menjana penutupan transitif objek boleh dicapai, algoritma merentasi medan objek, membaca nilainya menggunakan pantulan. Adalah penting untuk ambil perhatian bahawa pembina imej beroperasi dalam persekitaran Java. Hanya medan contoh yang ditandakan sebagai "dibaca" oleh analisis titik ke yang dipertimbangkan semasa traversal ini. Sebagai contoh, jika kelas mempunyai dua medan contoh tetapi satu tidak ditandakan sebagai dibaca, objek yang boleh dicapai melalui medan tidak bertanda akan dikecualikan daripada timbunan imej.
Apabila menemui nilai medan yang kelasnya belum dikenal pasti sebelum ini oleh analisis titik ke, kelas didaftarkan sebagai jenis medan. Pendaftaran ini memastikan bahawa dalam lelaran seterusnya analisis titik ke, jenis baharu disebarkan kepada semua bacaan medan dan penggunaan transitif dalam graf aliran jenis.
Coretan kod di bawah menggariskan algoritma teras untuk petikan timbunan:
Declare List worklist := [] Declare Set reachableObjects := [] Function BuildHeapSnapshot(PointsToState pointsToState) For Each field in pointsToState.getReachableStaticObjectFields() Call AddObjectToWorkList(field.readValue()) End For For Each method in pointsToState.getReachableMethods() For Each constant in method.embeddedConstants() Call AddObjectToWorkList(constant) End For End For While worklist.isNotEmpty Object current := Pop from worklist If current Object is an Array For Each value in current Call AddObjectToWorkList(value) Add current.getClass() to pointsToState.getObjectArrayTypes() End For Else For Each field in pointsToState.getReachableInstanceObjectFields(current.getClass()) Object value := field.read(current) Call AddObjectToWorkList(value) Add value.getClass() to pointsToState.getFieldValueTypes(field) End For End If End While Return reachableObjects End Function
Ringkasnya, algoritma snapshot timbunan membina syot kilat timbunan dengan cekap dengan merentasi objek yang boleh dicapai dan medannya secara sistematik. Ini memastikan bahawa hanya objek yang berkaitan dimasukkan ke dalam timbunan imej, mengoptimumkan prestasi dan jejak memori imej asli.
Kesimpulannya, proses tangkapan tangkapan timbunan memainkan peranan penting dalam penciptaan imej asli. Dengan melintasi objek boleh dicapai dan medannya secara sistematik, algoritma tangkapan tangkapan timbunan membina graf objek yang mewakili penutupan transitif objek boleh dicapai daripada penunjuk akar seperti medan statik. Graf objek ini kemudiannya dibenamkan ke dalam imej asli sebagai timbunan imej, berfungsi sebagai timbunan awal apabila imej asli dimulakan.
Sepanjang proses, algoritma bergantung pada keadaan analisis titik untuk menentukan objek dan medan yang relevan untuk dimasukkan dalam timbunan imej. Objek dan medan yang ditandakan sebagai "dibaca" oleh analisis titik ke dipertimbangkan, manakala entiti yang tidak bertanda dikecualikan. Selain itu, apabila menemui jenis yang tidak kelihatan sebelum ini, algoritma mendaftarkannya untuk penyebaran dalam lelaran seterusnya analisis titik-ke.
Secara keseluruhannya, tangkapan tangkapan timbunan mengoptimumkan prestasi dan penggunaan memori imej asli dengan memastikan bahawa hanya objek yang diperlukan disertakan dalam timbunan imej. Pendekatan sistematik ini meningkatkan kecekapan dan kebolehpercayaan pelaksanaan imej asli.
Atas ialah kandungan terperinci Meningkatkan Prestasi dengan Analisis Statik, Permulaan Imej dan Syot Kilat Timbunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!