Implementasi JVM kanonik dari Sun menerapkan beberapa pengoptimalan yang cukup canggih pada bytecode untuk mendapatkan kecepatan eksekusi yang mendekati asli setelah kode dijalankan beberapa kali.
Pertanyaannya adalah, mengapa kode yang dikompilasi ini tidak di-cache ke disk untuk digunakan selama penggunaan berikutnya dari fungsi / kelas yang sama?
Seperti berdiri, setiap kali program dijalankan, kompilator JIT dijalankan lagi, daripada menggunakan versi kode yang telah dikompilasi sebelumnya. Bukankah menambahkan fitur ini menambah dorongan yang signifikan pada waktu jalan awal program, ketika bytecode pada dasarnya sedang diinterpretasikan?
Jawaban:
Tanpa menggunakan cut'n'paste dari tautan yang diposting @MYYN, saya curiga ini karena pengoptimalan yang dilakukan JVM tidak statis, melainkan dinamis, berdasarkan pola data serta pola kode. Sepertinya pola data ini akan berubah selama masa pakai aplikasi, membuat pengoptimalan yang disimpan dalam cache kurang dari optimal.
Jadi, Anda memerlukan mekanisme untuk menetapkan apakah pengoptimalan yang disimpan masih optimal, pada titik mana Anda sebaiknya mengoptimalkan ulang dengan cepat.
sumber
JVM Oracle memang didokumentasikan untuk melakukannya - mengutip Oracle,
Saya tidak tahu mengapa semua implementasi VM yang canggih tidak menawarkan opsi serupa.
sumber
Pembaruan untuk jawaban yang ada - Java 8 memiliki JEP yang didedikasikan untuk menyelesaikan ini:
=>
JEP 145: Kode Kompilasi Cache. Tautan baru .Pada tingkat yang sangat tinggi, tujuan yang dinyatakan adalah :
Semoga ini membantu.
sumber
Excelsior JET memiliki kompiler JIT caching sejak versi 2.0, dirilis pada tahun 2001. Selain itu, kompiler AOT-nya dapat mengkompilasi ulang cache menjadi satu DLL / objek bersama menggunakan semua pengoptimalan.
sumber
Saya tidak tahu alasan sebenarnya, tidak terlibat dengan cara apa pun dalam implementasi JVM, tetapi saya dapat memikirkan beberapa alasan yang masuk akal:
Tapi saya benar-benar menebak, dan seperti yang Anda lihat, saya tidak benar-benar berpikir alasan saya adalah penghenti pertunjukan yang sebenarnya. Saya pikir Sun tidak menganggap dukungan ini sebagai prioritas, dan mungkin alasan pertama saya mendekati kebenaran, karena melakukan ini biasanya mungkin juga membuat orang berpikir bahwa file kelas Java benar-benar membutuhkan versi terpisah untuk setiap VM daripada menjadi lintas platform.
Cara yang saya sukai sebenarnya adalah memiliki penerjemah bytecode-to-native terpisah yang dapat Anda gunakan untuk melakukan sesuatu seperti ini secara eksplisit sebelumnya, membuat file kelas yang secara eksplisit dibangun untuk VM tertentu, dengan kemungkinan bytecode asli di dalamnya sehingga Anda dapat berjalan dengan VM yang berbeda juga. Tapi itu mungkin berasal dari pengalaman saya: Saya kebanyakan melakukan Java ME, di mana sangat menyakitkan karena kompiler Java tidak lebih pintar tentang kompilasi.
sumber