Pendahuluan: Analisis Escape adalah titik teknis yang tidak digunakan dalam banyak teknologi JVM. Artikel ini akan menganalisis skenario penggunaannya melalui contoh.
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.
Dalam prinsip optimasi kompiler bahasa komputer, analisis pelarian mengacu pada metode menganalisis rentang dinamis pointer, yang terkait dengan analisis pointer dan analisis penampilan prinsip optimasi kompiler. Ketika variabel (atau objek) dialokasikan dalam suatu metode, pointernya dapat dikembalikan atau direferensikan secara global, yang akan dirujuk oleh proses atau utas lain. Fenomena ini disebut pelarian pointer (atau referensi).
Java mendukung dan memungkinkan opsi analisis melarikan diri di Java SE 6U23 dan versi yang lebih baru. Kompiler JIT Hotspot Java dapat melakukan analisis melarikan diri pada kode ketika metode ini kelebihan beban atau dimuat secara dinamis. Pada saat yang sama, karakteristik objek Java yang dialokasikan pada tumpukan dan utas bawaan menjadikan analisis pelarian sebagai fungsi penting dari Java.
Paragraf di atas adalah bagian yang saya kutip dari orang lain. Artikel ini menggunakan banyak istilah profesional. Izinkan saya meringkas artinya:
Analisis pelarian digunakan untuk menentukan apakah instance atau variabel tertentu dialokasikan dalam tumpukan. Jika analisis pelarian diaktifkan, variabel -variabel ini dapat dialokasikan langsung pada tumpukan daripada di tumpukan. Pointer untuk variabel -variabel ini dapat dirujuk secara global, atau direferensikan oleh utas lain.
Nyalakan pengaturan
Default diaktifkan pada JDK 6U23 atau lebih. Di sini kita akan mendefinisikan ulang pengaturan:
Dipaksa untuk membuka
-server -xx:+doDcapeanalysis -xx:+printgcdetail -xmx10m -xms10m
Analisis Escape Tutup
-server -xx: -doescapeanalysis -xx:+printgcdetail -xmx10m -xms10m
Verifikasi instance
Kode:
kelas publik onstacktest {public static void alloc () {byte [] b = byte baru [2]; B [0] = 1; } public static void main (string [] args) {long b = system.currentTimeMillis (); untuk (int i = 0; i <100000000; i ++) {alloc (); } long e = system.currentTimeMillis (); System.out.println (E - B); }}Aktifkan hasil operasi pelarian:
Tulis deskripsi gambar di sini
Hasil menjalankan analisis pelarian tidak diaktifkan:
Tulis deskripsi gambar di sini
Untuk menganalisis, di sini adalah untuk mengalokasikan 2 byte siklus data 10 juta kali, waktu berjalan untuk mengaktifkan pelarian adalah 8 miletik, sedangkan yang tidak diaktifkan adalah 956, yang hampir 1/120 dari tidak diaktifkan.
Efek perbedaan masih sangat jelas ...
Ruang pada tumpukan umumnya sangat kecil, dan hanya dapat menyimpan beberapa perubahan dan struktur data kecil, dan struktur penyimpanan berkapasitas besar tidak dapat dicapai. Contohnya di sini adalah puluhan juta kali ekstrem, menyoroti analisis pelarian, memungkinkannya dialokasikan langsung dari tumpukan, yang sangat mengurangi jumlah GC dan meningkatkan efisiensi eksekusi keseluruhan program.
Oleh karena itu, efek analisis pelarian hanya dapat berlaku dalam skenario tertentu, yang memenuhi struktur alokasi variabel dengan kapasitas yang relatif kecil dengan frekuensi tinggi dan jumlah tinggi.