1 Tinjauan
Java dikenal mendukung platform agnostik, keamanan, dan mobilitas jaringan. Platform Java terdiri dari mesin virtual Java dan kelas inti Java, yang menyediakan antarmuka pemrograman terpadu untuk program Java murni, terlepas dari sistem operasi yang lebih rendah. Justru karena mesin virtual Java yang diklaimnya "dikompilasi sekali, dijalankan di mana -mana" dapat dijamin.
1.1 Proses Eksekusi Program Java
Eksekusi program Java tergantung pada lingkungan kompilasi dan lingkungan berjalan. Kode sumber dikonversi menjadi kode mesin yang dapat dieksekusi, yang diselesaikan oleh proses berikut:
Inti dari Java Technology adalah Java Virtual Machine, karena semua program Java dijalankan di mesin virtual. Pengoperasian program Java membutuhkan kerja sama mesin Virtual Java, Java API dan file kelas Java. Contoh mesin virtual Java bertanggung jawab untuk menjalankan program Java. Ketika program Java dimulai, instance mesin virtual lahir. Saat program berakhir, instance mesin virtual mati.
Fitur lintas platform Java adalah karena memiliki mesin virtual yang menargetkan platform yang berbeda.
1.2 mesin virtual java
Tugas utama mesin virtual Java adalah memuat file kelas dan menjalankan bytecode di dalamnya. Seperti yang dapat dilihat dari gambar di bawah ini, mesin virtual Java berisi loader kelas, yang dapat memuat file kelas dari program dan API. Hanya kelas yang diperlukan untuk eksekusi program yang akan dimuat di Java API, dan bytecode dieksekusi oleh mesin eksekusi.
Ketika mesin virtual Java diimplementasikan oleh perangkat lunak pada sistem operasi host, program Java berinteraksi dengan host dengan memanggil metode lokal. Metode Java ditulis dalam bahasa Java, dikompilasi ke dalam bytecode, dan disimpan dalam file kelas. Metode lokal ditulis dalam bahasa C/C ++/perakitan, dikompilasi ke dalam kode mesin terkait prosesor, disimpan dalam pustaka tautan dinamis, dan formatnya adalah hak milik untuk setiap platform. Jadi metode lokal adalah menghubungkan program Java ke sistem operasi host yang mendasarinya.
Karena mesin virtual Java tidak tahu bagaimana file kelas dibuat dan apakah itu dirusak, itu mengimplementasikan detektor file kelas untuk memastikan bahwa jenis yang ditentukan dalam file kelas dapat digunakan dengan aman. Pemeriksa file kelas memastikan ketahanan program melalui empat pemindaian independen:
・ Kumpulan file kelas
・ Pemeriksaan Semantik Tipe Data
・ Verifikasi bytecode
・ Verifikasi referensi simbol
Saat mengeksekusi bytecode, mesin virtual Java juga melakukan mekanisme keamanan bawaan lainnya. Mereka adalah karakteristik untuk memastikan ketahanan program Java sebagai bahasa pemrograman Java, dan juga karakteristik mesin virtual Java:
・ Konversi referensi jenis-aman
・ Akses memori terstruktur
・ Koleksi Sampah Otomatis
・ Pemeriksaan batas array
・ Cek kutipan kosong
1.3 Java Virtual Machine Data Tipe
Mesin virtual Java melakukan perhitungan melalui tipe data tertentu. Jenis data dapat dibagi menjadi dua jenis: tipe dasar dan jenis referensi, seperti yang ditunjukkan pada gambar di bawah ini:
Tapi Boolean agak istimewa. Ketika kompiler mengkompilasi kode sumber java menjadi bytecode, itu akan mewakili boolean dengan int atau byte. Dalam mesin virtual Java, false diwakili oleh 0, dan true diwakili oleh semua bilangan bulat nol. Seperti bahasa Java, kisaran nilai jenis dasar mesin virtual Java konsisten di mana-mana, tidak peduli apa platform host, yang panjang selalu merupakan bilangan bulat yang ditandatangani dengan komplemen 64-bit dua di mesin virtual apa pun.
Untuk ReturnAddress, tipe dasar ini digunakan untuk mengimplementasikan klausa akhirnya dalam program Java. Pemrogram Java tidak dapat menggunakan jenis ini, nilainya menunjuk ke opcode instruksi mesin virtual.
2 architecture
Dalam spesifikasi mesin virtual Java, perilaku instance mesin virtual dijelaskan dalam hal subsistem, area memori, tipe data, dan instruksi, dan komponen -komponen ini bersama -sama menunjukkan arsitektur internal mesin virtual abstrak.
2.1 fileClass file
File JavaClass berisi semua informasi tentang kelas atau antarmuka. "Jenis dasar" dari file kelas adalah sebagai berikut:
| U1 | 1 byte, tipe yang tidak ditandatangani |
| U2 | 2 byte, tipe yang tidak ditandatangani |
| U4 | 4 byte, tipe yang tidak ditandatangani |
| U8 | 8 byte, tipe yang tidak ditandatangani |
Jika Anda ingin tahu lebih banyak, Oracle JVM SE7 memberikan spesifikasi resmi: Spesifikasi Mesin Virtual Java®
Isi file kelas:
ClassFile {U4 Magic; // Nomor ajaib: 0xCafeBabe, digunakan untuk menentukan apakah itu file kelas java u2 minor_version; // Nomor Versi Kecil U2 Major_Version; // Nomor Versi Utama U2 Constant_Pool_Count; // Ukuran Pool Constant CP_INFO Constant_pool [constant_pool_count-1]; // konstan pool u2 access_flags; // akses bendera di tingkat kelas dan antarmuka (diperoleh melalui | operasi) u2 this_class; // indeks kelas (menunjuk ke konstanta kelas di pool konstan) u2 super_class; // Indeks kelas sekarang (menunjuk ke konstanta kelas dalam kumpulan konstan) u2 antarmuka_count; // indeks antarmuka penghitung antarmuka U2 [antarmuka_count]; // Indeks Antarmuka Set U2 Fields_count; // Field Count Counter Field_info Fields [fields_count]; // Tabel Lapangan Set U2 Metode_Count; // metode penghitungan metode counter method_info [Methods_count]; // Metode tabel set u2 attributes_count; // jumlah atribut atribut_info atribut [atributes_count]; // Tabel atribut} 2.2 Subsistem Loader Kelas
Subsistem Loader Class bertanggung jawab untuk menemukan dan memuat informasi jenis. Bahkan, ada dua jenis loader untuk mesin virtual Java: pemuat sistem dan pemuat yang ditentukan pengguna. Yang pertama adalah bagian dari implementasi mesin virtual Java, sedangkan yang terakhir adalah bagian dari program Java.
・ BootstrapClassLoader: digunakan untuk memuat pustaka inti Java, diimplementasikan dalam kode asli, dan tidak diwarisi dari java.lang.classloader.
・ ExtensionClassLoader: digunakan untuk memuat pustaka ekstensi java. Implementasi mesin virtual Java akan menyediakan direktori perpustakaan ekstensi. Loader kelas ini mencari dan memuat kelas Java di direktori ini.
・ Loader kelas aplikasi: Memuat kelas Java sesuai dengan Classpath dari Aplikasi Java (ClassPath). Secara umum, kelas aplikasi Java dimuat olehnya. Ini dapat diperoleh melalui classloader.getSystemClassLoader ().
Selain loader kelas yang disediakan oleh sistem, pengembang dapat mengimplementasikan loader kelas mereka sendiri dengan mewarisi kelas java.lang.classloader untuk memenuhi beberapa kebutuhan khusus.
Subsistem Loader Class melibatkan beberapa komponen lain dari mesin virtual Java dan kelas -kelas dari Perpustakaan Java.lang. Metode yang ditentukan oleh ClassLoader menyediakan antarmuka untuk program untuk mengakses mekanisme loader kelas. Selain itu, untuk setiap jenis yang dimuat, mesin virtual Java membuat instance dari kelas java.lang.class untuk mewakili tipe. Seperti objek lainnya, loader kelas yang ditentukan pengguna dan instance kelas ditempatkan di area tumpukan dalam memori, sedangkan informasi tipe yang dimuat terletak di area metode.
Selain menemukan dan mengimpor file kelas biner, subsistem Loader kelas juga harus bertanggung jawab untuk memverifikasi kebenaran kelas yang diimpor, mengalokasikan dan menginisialisasi memori untuk variabel kelas, dan parsing referensi simbolik. Tindakan ini juga perlu dilakukan dalam urutan berikut:
・ Muat (temukan dan muat data biner dari jenis)
・ Koneksi (Verifikasi Eksekusi: Pastikan kebenaran jenis yang diimpor; Persiapan: Alokasikan memori untuk variabel kelas dan inisialisasi mereka ke nilai default; Parsing: Konversi referensi simbolik dalam jenis menjadi referensi langsung)
・ Inisialisasi (variabel kelas diinisialisasi ke nilai awal yang benar)
2.3 Metode Area
Dalam mesin virtual Java, informasi tentang jenis yang dimuat disimpan dalam memori di area metode. Ketika mesin virtual memuat jenis tertentu, ia menggunakan loader kelas untuk menemukan file kelas yang sesuai, kemudian membaca file kelas dan mentransfernya ke mesin virtual. Kemudian mesin virtual mengekstrak informasi jenis di dalamnya dan menyimpan informasi ini di area metode. Area metode juga dapat dikumpulkan oleh pengumpul sampah, karena mesin virtual memungkinkan perpanjangan dinamis program Java melalui loader kelas yang ditentukan pengguna.
Informasi berikut disimpan di area metode:
・ Jenis nama yang sepenuhnya memenuhi syarat ini (seperti nama yang sepenuhnya memenuhi syarat java.lang.Object)
・ Nama yang sepenuhnya memenuhi syarat dari jenis superclass langsung ini
・ Apakah tipe jenis kelas atau jenis antarmuka ini
・ Jenis pengubah akses ini (subset publik, abstrak, final)
・ Daftar nama yang sepenuhnya memenuhi syarat untuk hyperinterface langsung
・ Kolam konstan jenis ini (koleksi yang dipesan termasuk konstanta langsung [string, integer dan konstanta floatingpoint] dan referensi simbolik untuk jenis, bidang, dan metode lain)
・ Informasi Lapangan (Nama Bidang, Ketik, Pengubah)
・ Informasi Metode (Nama Metode, Jenis Pengembalian, Jumlah Parameter dan Jenis, Pengubah)
・ Semua variabel kelas (statis) kecuali konstanta
・ Referensi ke kelas ClassLoader (ketika setiap jenis dimuat, mesin virtual harus melacak apakah dimuat oleh pemuat kelas startup atau loader kelas yang ditentukan pengguna)
・ Referensi ke kelas kelas (untuk setiap jenis yang dimuat, mesin virtual akan membuat instance dari kelas java.lang.class yang sesuai. Misalnya, jika Anda memiliki referensi ke objek dari Java.lang.integer Class, maka Anda hanya perlu memanggil metode getClass () yang dirujuk oleh objek integer untuk mendapatkan objek kelas yang mewakili java.
2.4 Tumpukan
Semua instance atau array kelas yang dibuat oleh program Java saat runtime (array adalah objek nyata dalam mesin virtual Java) ditempatkan di tumpukan yang sama. Karena Java Virtual Machine, instance hanya memiliki satu ruang tumpukan, semua utas akan berbagi tumpukan ini. Perlu dicatat bahwa mesin virtual Java memiliki instruksi untuk mengalokasikan objek di tumpukan, tetapi tidak memiliki instruksi untuk membebaskan memori, karena mesin virtual menyerahkan tugas ini kepada pengumpul sampah untuk diproses. Spesifikasi mesin virtual Java tidak menegakkan kolektor sampah, itu hanya mensyaratkan bahwa implementasi mesin virtual harus mengelola ruang tumpukan mereka sendiri "dalam beberapa cara". Misalnya, implementasi hanya dapat memiliki ruang tumpukan ukuran tetap. Ketika ruang diisi, itu hanya melempar pengecualian outofmemory, yang tidak mempertimbangkan masalah daur ulang benda sampah, tetapi sesuai dengan spesifikasi.
Spesifikasi Mesin Virtual Java tidak menentukan bagaimana objek Java diwakili dalam heap, yang memberi pelaksana keputusan mesin virtual tentang cara merancang. Desain tumpukan yang mungkin adalah sebagai berikut:
Kolam pegangan, kolam objek. Referensi objek adalah penunjuk lokal ke kumpulan pegangan. Manfaat dari desain ini kondusif untuk penyortiran fragmen tumpukan. Saat memindahkan objek di kumpulan objek, bagian pegangan hanya perlu mengubah alamat baru pointer yang menunjuk ke objek. Kerugiannya adalah bahwa setiap kali variabel instance suatu objek diakses, harus dilewatkan melalui dua pointer.
2.5 Java Stack
Setiap kali utas dimulai, mesin virtual Java mengalokasikan tumpukan Java untuk itu. Tumpukan Java terdiri dari banyak bingkai tumpukan, satu bingkai tumpukan berisi keadaan panggilan metode Java. Ketika utas memanggil metode Java, mesin virtual mendorong bingkai tumpukan baru ke tumpukan java utas. Saat metode kembali, bingkai tumpukan muncul dari tumpukan Java. Java Stack menyimpan status panggilan metode Java di utas - termasuk variabel lokal, parameter, nilai pengembalian, dan hasil operasi menengah, dll. Mesin virtual Java tidak memiliki register, dan set instruksi mereka menggunakan tumpukan Java untuk menyimpan data perantara. Alasan untuk desain ini adalah untuk menjaga set instruksi mesin virtual Java se -kompak mungkin, dan juga memfasilitasi implementasi mesin virtual Java pada platform dengan beberapa register umum. Selain itu, arsitektur berbasis tumpukan juga membantu mengoptimalkan kode kompiler dinamis dan kompiler instan yang diimplementasikan oleh mesin virtual tertentu selama runtime.
2.5.1 bingkai tumpukan
Bingkai tumpukan terdiri dari area variabel lokal, tumpukan operan dan area data bingkai. Ketika mesin virtual memanggil metode Java, ia memperoleh area variabel lokal dan ukuran tumpukan operan dari metode ini dari informasi jenis kelas yang sesuai, dan mengalokasikan memori bingkai tumpukan sesuai dengan ini, dan kemudian mendorongnya ke tumpukan Java.
2.5.1.1 Area Variabel Lokal
Area variabel lokal diatur ke dalam array yang dihitung dari 0 dalam satuan panjang kata. Instruksi bytecode menggunakan data di dalamnya melalui indeks mulai dari 0. Nilai tipe int, float, referensi dan returnAddress menempati satu item dalam array, sedangkan nilai jenis byte, pendek dan char dikonversi ke nilai int sebelum disimpan dalam array, dan juga menempati satu item. Tetapi nilai -nilai jenis panjang dan ganda menempati dua istilah berturut -turut dalam array.
2.5.1.2 Tumpukan Operan
Seperti area variabel lokal, tumpukan operan juga diatur ke dalam array dalam panjang kata. Ini mengakses melalui tumpukan operasi tumpukan standar dan tumpukan. Karena penghitung program tidak dapat diakses secara langsung dengan instruksi program, instruksi mesin virtual Java memperoleh operan dari tumpukan operan, sehingga operasinya didasarkan pada tumpukan daripada pada register. Mesin virtual mengambil tumpukan operan sebagai ruang kerja, karena sebagian besar instruksi harus memunculkan data dari sini, melakukan operasi, dan kemudian mendorong hasilnya kembali ke tumpukan operan.
2.5.1.3 Area data bingkai
Selain area variabel lokal dan tumpukan operan, bingkai tumpukan java juga membutuhkan area data bingkai untuk mendukung analisis kumpulan konstan, pengembalian metode normal, dan mekanisme pengiriman pengecualian. Setiap kali mesin virtual ingin menjalankan instruksi yang membutuhkan data kumpulan konstan, ia mengaksesnya melalui pointer ke kumpulan konstan di area data bingkai. Selain penguraian kumpulan konstan, area data bingkai juga membantu mesin virtual untuk menangani akhir normal atau abnormal dari metode java. Jika pengembalian berakhir secara normal, mesin virtual harus mengembalikan bingkai tumpukan metode yang memulai panggilan, termasuk mengatur penghitung program untuk menunjuk ke instruksi berikutnya yang memulai metode panggilan; Jika metode ini memiliki nilai pengembalian, mesin virtual perlu mendorongnya ke tumpukan operan metode yang memulai panggilan. Untuk menangani keluar pengecualian selama eksekusi metode Java, area data bingkai juga memiliki referensi ke tabel pengecualian dari metode ini.
2.6 Penghitung Program
Untuk program Java yang sedang berjalan, setiap utas memiliki penghitung programnya. Penghitung program juga disebut register PC. Penghitung program dapat menampung pointer lokal dan returnAddress. Ketika utas menjalankan metode Java, nilai penghitung program selalu merupakan alamat dari instruksi yang dieksekusi berikutnya. Alamat di sini dapat berupa pointer lokal atau offset dalam metode bytecode metode relatif terhadap instruksi mulai metode. Jika utas menjalankan metode lokal, nilai penghitung program "tidak ditentukan".
2.7 Tumpukan Metode Lokal
Antarmuka metode lokal apa pun akan menggunakan beberapa jenis tumpukan metode lokal. Ketika utas memanggil metode Java, mesin virtual membuat bingkai tumpukan baru dan mendorongnya ke tumpukan java. Ketika menyebut metode lokal, mesin virtual menjaga tumpukan Java tidak berubah dan tidak lagi mendorong ke tumpukan baru di tumpukan java yang berulir. Mesin virtual hanya menghubungkan secara dinamis dan langsung memanggil metode lokal yang ditentukan.
Area metode dan tumpukan dibagikan oleh semua utas dalam instance mesin virtual. Ketika mesin virtual memuat file kelas, itu mem -parsing informasi jenis dari data biner yang terkandung dalam file kelas, dan kemudian menempatkan informasi jenis di area metode. Saat program berjalan, mesin virtual menempatkan semua objek yang dibuat oleh program saat runtime ke dalam heap.
Seperti area memori runtime lainnya, area memori yang ditempati oleh tumpukan metode lokal dapat diperluas secara dinamis atau menyusut sesuai kebutuhan.
3 mesin eksekusi
Dalam spesifikasi mesin virtual Java, perilaku mesin eksekusi didefinisikan menggunakan set instruksi. Perancang yang mengimplementasikan mesin eksekusi akan memutuskan cara menjalankan bytecode, implementasi dapat ditafsirkan, dikompilasi dengan cepat, atau dieksekusi secara langsung menggunakan instruksi pada chip, atau campurannya.
Mesin eksekusi dapat dipahami sebagai spesifikasi abstrak, implementasi konkret, atau instance berjalan. Spesifikasi Abstrak Gunakan set instruksi untuk menentukan perilaku mesin eksekusi. Implementasi spesifik dapat menggunakan berbagai teknologi yang berbeda - termasuk perangkat lunak, perangkat keras atau kombinasi teknologi pohon. Mesin eksekusi sebagai instance runtime adalah utas.
Setiap utas program Java yang sedang berjalan adalah contoh dari mesin eksekusi mesin virtual independen. Dari awal hingga akhir siklus hidup utas, ia menjalankan bytecode atau menjalankan metode lokal.
3.1 Set Instruksi
Aliran Bytecode dari metode ini terdiri dari urutan instruksi dari mesin virtual Java. Setiap instruksi berisi opcode byte tunggal diikuti oleh 0 atau lebih operan. Opcode mewakili operasi yang akan dilakukan; Operand memberikan mesin virtual Java dengan informasi tambahan yang diperlukan untuk menjalankan opcode. Ketika mesin virtual menjalankan instruksi, ia dapat menggunakan item dalam kumpulan konstan saat ini, nilai -nilai dalam variabel lokal dari bingkai saat ini, atau nilai -nilai di bagian atas tumpukan operan dari bingkai saat ini.
Mesin eksekusi abstrak menjalankan satu instruksi bytecode pada satu waktu. Setiap utas (contoh mesin eksekusi) dari program yang berjalan di mesin virtual Java melakukan operasi ini. Mesin eksekusi memperoleh opcode, dan jika opcode memiliki operan, ia memperoleh operannya. Ini melakukan tindakan yang ditentukan oleh opcode dan operan ikuti, dan kemudian memperoleh opcode berikutnya. Proses pelaksanaan bytecode ini akan berlanjut sampai utas selesai, dan penyelesaian utas dapat ditandai dengan kembali dari metode awalnya atau tidak menangkap pengecualian yang dilemparkan.
4 antarmuka metode lokal
Antarmuka lokal Java, juga disebut JNI (JavanativeInterface), disiapkan untuk portabilitas. Antarmuka metode lokal memungkinkan metode lokal untuk melakukan hal berikut:
Lulus atau mengembalikan data
Variabel instance operasi
Mengoperasikan variabel kelas atau metode kelas panggilan
Array operan
Kunci objek tumpukan
Muat kelas baru
Lemparkan pengecualian
Tangkap pengecualian yang dilemparkan dengan metode lokal yang memanggil metode java
Tangkap pengecualian asinkron yang dilemparkan oleh mesin virtual
Menunjukkan bahwa objek pengumpul sampah tidak lagi diperlukan
Meringkaskan
Di atas adalah semua tentang artikel ini tentang pemahaman mendalam tentang arsitektur mesin virtual Java, dan saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke topik terkait lainnya di situs ini. Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!