Secara umum diyakini bahwa objek yang baru semuanya dialokasikan pada tumpukan, tetapi ini tidak sepenuhnya benar. Melalui analisis proses alokasi objek Java, kami menemukan bahwa selain dialokasikan pada tumpukan, objek juga dapat mengalokasikan ruang dalam tumpukan atau TLAB. Dasar teknis untuk mengalokasikan objek pada tumpukan adalah analisis pelarian dan penggantian skalar. Artikel ini terutama memperkenalkan analisis pelarian.
Definisi analisis pelarian
Escape Analysis adalah algoritma analisis aliran data global lintas fungsional yang dapat secara efektif mengurangi beban sinkron dan tekanan alokasi heap memori dalam program Java.
Melalui analisis melarikan diri, kompiler Java Hotspot dapat menganalisis ruang lingkup penggunaan referensi objek baru dan menentukan apakah akan mengalokasikan objek ke tumpukan.
Java mendukung dan memungkinkan opsi analisis melarikan diri di Java SE 6U23 dan versi yang lebih baru. Kompiler JIT Hotspot Java dapat melakukan analisis Escape dari kode ketika metode ini kelebihan beban atau dimuat secara dinamis.
Perilaku dasar analisis pelarian adalah untuk menganalisis ruang lingkup dinamis suatu objek: Ketika suatu objek didefinisikan dalam suatu metode, itu dapat dirujuk dengan metode eksternal.
Metode Escape: Misalnya, lulus sebagai parameter panggilan ke metode lain.
Thread Escape: Dapat diakses oleh utas eksternal, seperti menetapkan nilai ke variabel kelas atau variabel instan yang dapat diakses di utas lain.
Dasar teoritis dari analisis pelarian
Analisis pelarian dilakukan berdasarkan algoritma yang dijelaskan oleh Jong-deok Choi, Manish Gupta, Mauricio Seffano, Vugramam C. Sreedhar, Sam Midkiff dan lainnya dalam makalah "Escape Analysis for Java".
Algoritma ini memperkenalkan grafik yang terhubung, dan menggunakan grafik yang terhubung untuk membangun hubungan yang dapat diakses antara referensi objek dan objek, dan berdasarkan ini, metode analisis aliran data gabungan diusulkan. Karena algoritma ini bergantung pada konteks dan sensitif terhadap aliran, dan mensimulasikan hubungan bersarang di setiap tingkat objek, akurasi analisisnya tinggi, tetapi waktu berjalan dan konsumsi memori relatif besar.
Sebagian besar implementasi analisis pelarian didasarkan pada premis "dunia tertutup": semua metode yang mungkin dijalankan telah diketahui sebelum analisis melarikan diri, dan operasi aktual program tidak akan mengubah hubungan panggilan di antara mereka. Tetapi ketika program Java yang nyata berjalan, asumsi seperti itu tidak berlaku. Banyak fitur program Java, seperti pemuatan kelas dinamis, memanggil fungsi lokal, dan mencerminkan panggilan program, akan merusak konvensi yang disebut "dunia tertutup".
Operasi Pemrosesan Setelah Analisis Escape
Setelah analisis melarikan diri, tiga kemungkinan pelarian objek dapat diperoleh:
Globalescape: Artinya, referensi suatu objek lolos dari metode atau utas. Misalnya, referensi objek disalin ke variabel kelas, atau disimpan dalam objek yang telah melarikan diri, atau referensi objek dikembalikan ke metode panggilan sebagai nilai pengembalian metode.
Argescape (Parameter Level Escape): Artinya, aplikasi objek yang diteruskan ke metode selama proses panggilan metode. Keadaan ini dapat ditentukan dengan menganalisis kode biner dari metode yang disetel.
Noescape: Objek yang dapat diganti dengan skalar. Objek mungkin tidak dialokasikan pada tumpukan tradisional.
Kompiler dapat menggunakan hasil analisis pelarian untuk mengoptimalkan program:
Objek alokasi heap menjadi objek alokasi tumpukan: objek dalam metode, dan referensi objek tidak lepas, sehingga metode ini dapat dialokasikan pada memori tumpukan dan sangat umum untuk menumpuk memori.
Menghilangkan sinkronisasi: Biaya sinkronisasi utas cukup tinggi, dan konsekuensi sinkronisasi mengurangi konkurensi dan kinerja. Analisis Escape dapat menentukan apakah suatu objek selalu diakses hanya oleh satu utas. Jika diakses hanya oleh satu utas, maka operasi sinkronisasi objek dapat dikonversi menjadi operasi tanpa perlindungan sinkronisasi, yang dapat sangat meningkatkan tingkat konkurensi dan kinerja.
Substitusi Vektor: Escape Analysis Metode Jika Anda menemukan bahwa struktur penyimpanan memori objek tidak perlu dilakukan terus menerus, Anda dapat menghemat suku cadang dan bahkan semua objek dalam register CPU, yang dapat sangat meningkatkan kecepatan akses.