Rumah > Java > javaTutorial > teks badan

Meningkatkan Prestasi dengan Analisis Statik, Permulaan Imej dan Syot Kilat Timbunan

PHPz
Lepaskan: 2024-09-03 10:30:59
asal
202 orang telah melayarinya

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?

Imej Asli: Mengoptimumkan Masa Permulaan dan Jejak Memori

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.

Aliran Kerja Terperinci

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)

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

Rajah 1 – Proses Binaan Imej Asli(sumber: redhat.com)

Analisis Mata kepada

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).

Enhancing Performance with Static Analysis, Image Initialization and Heap Snapshotting

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.

Jalankan Kod Permulaan

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:

  1. Pemula Kelas: Setiap kelas Java boleh mempunyai pemula kelas yang ditunjukkan oleh kaedah , yang memulakan medan statik. Pembangun boleh memilih kelas yang hendak dimulakan pada masa bina vs masa jalan.

  2. 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.

API Pasif (mempertanyakan status analisis semasa)

boolean isReachable(Class<?> clazz);

boolean isReachable(Field field);

boolean isReachable(Executable method);
Salin selepas log masuk

Untuk maklumat lanjut, rujuk QueryReachabilityAccess

API Aktif (mendaftarkan panggilan balik untuk perubahan status analisis):

void registerReachabilityHandler(Consumer<DuringAnalysisAccess> callback, Object... elements);

void registerSubtypeReachabilityHandler(BiConsumer<DuringAnalysisAccess, Class<?>> callback, Class<?> baseClass);

void registerMethodOverrideReachabilityHandler(BiConsumer<DuringAnalysisAccess, Executable> callback, Executable baseMethod);
Salin selepas log masuk

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.

Timbunan Syot Kilat

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
Salin selepas log masuk

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.

Kesimpulan

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!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!