1. Apakah itu Java Virtual Machine
Apabila anda bercakap tentang Java Virtual Machine, anda mungkin merujuk kepada:
1 Abstrak Java Virtual Machine
2 > 3. Contoh mesin maya Java yang sedang berjalan
2. Kitaran hayat mesin maya Java
Mesin maya Java yang sedang berjalan mempunyai tugas yang jelas: laksanakan program Java. Ia berjalan apabila program mula melaksanakan dan berhenti apabila program tamat. Jika anda menjalankan tiga program pada mesin yang sama, akan ada tiga mesin maya Java yang sedang berjalan.
Mesin maya Java sentiasa bermula dengan kaedah main() Kaedah ini mestilah awam, kembali tidak sah dan menerima tatasusunan rentetan secara langsung. Apabila program dilaksanakan, anda mesti menentukan nama kelas yang membalut kaedah main() ke mesin maya Java.
Kaedah Main() ialah titik permulaan atur cara dan urutan di mana ia dilaksanakan dimulakan sebagai urutan awal atur cara. Semua utas lain dalam program ini dimulakan olehnya. Terdapat dua jenis benang dalam Java: benang daemon dan benang bukan daemon. Benang daemon ialah benang yang digunakan oleh mesin maya Java itu sendiri Sebagai contoh, benang yang bertanggungjawab untuk pengumpulan sampah ialah benang daemon. Sudah tentu, anda juga boleh menetapkan program anda sendiri sebagai benang daemon. Benang awal yang mengandungi kaedah Main() bukan benang daemon.
Selagi terdapat utas biasa yang dilaksanakan dalam mesin maya Java, mesin maya Java tidak akan berhenti. Jika anda mempunyai kebenaran yang mencukupi, anda boleh menamatkan program dengan memanggil kaedah exit().
3. Senibina Mesin Maya Java
Satu siri subsistem, kawasan memori, jenis data dan garis panduan penggunaan ditakrifkan dalam spesifikasi mesin maya Java. Komponen-komponen ini membentuk struktur dalaman mesin maya Java Mereka bukan sahaja menyediakan struktur dalaman yang jelas untuk pelaksanaan mesin maya Java, tetapi juga mengawal secara ketat tingkah laku luaran pelaksanaan mesin maya Java.
Setiap mesin maya Java mempunyai subsistem pemuat kelas (subsistem pemuat kelas), yang bertanggungjawab untuk memuatkan jenis (kelas dan antara muka) dalam program dan memberi mereka nama unik. Setiap mesin maya Java mempunyai enjin pelaksanaan (enjin pelaksanaan) yang bertanggungjawab untuk melaksanakan arahan yang terkandung dalam kelas yang dimuatkan.
Pelaksanaan program memerlukan sejumlah ruang memori, seperti bytecode, maklumat tambahan lain kelas yang dimuatkan, objek dalam program, parameter kaedah, nilai pulangan, pembolehubah tempatan, pembolehubah perantaraan yang diproses, dsb. Mesin maya Java menyimpan semua maklumat ini dalam kawasan data. Walaupun setiap pelaksanaan mesin maya Java termasuk kawasan data, peruntukan spesifikasi mesin maya Java untuk kawasan data adalah sangat abstrak. Banyak butiran struktur diserahkan kepada pelaksana mesin maya Java. Struktur memori pada pelaksanaan mesin maya Java berbeza secara meluas. Sesetengah pelaksanaan mungkin menggunakan banyak memori, manakala yang lain mungkin menggunakan memori yang sangat sedikit; sesetengah pelaksanaan mungkin menggunakan memori maya dan yang lain tidak. Spesifikasi memori mesin maya Java yang agak halus ini membolehkan mesin maya Java dilaksanakan pada pelbagai platform.
Sebahagian daripada kawasan data dikongsi oleh keseluruhan program dan bahagian lain dikawal oleh urutan yang berasingan. Setiap mesin maya Java mengandungi kawasan kaedah dan timbunan, yang dikongsi oleh keseluruhan program. Selepas mesin maya Java memuatkan dan menghuraikan kelas, ia menyimpan maklumat yang dihuraikan daripada fail kelas dalam kawasan kaedah. Objek yang dicipta apabila program dilaksanakan disimpan dalam timbunan.
Apabila thread dicipta, ia akan memperuntukkan "pc register" daftar PCnya sendiri (kaunter program) dan Java stack (Java stack). Apabila benang tidak menggunakan kaedah asli, daftar PC menyimpan arahan seterusnya yang dilaksanakan oleh benang. Timbunan Java menyimpan keadaan apabila benang memanggil kaedah, termasuk pembolehubah tempatan, parameter kaedah panggilan, nilai pulangan dan pembolehubah perantaraan yang diproses. Keadaan apabila kaedah asli dipanggil disimpan dalam susunan kaedah asli, mungkin dalam daftar atau ingatan bukan platform bebas lain.
Timbunan Java terdiri daripada bingkai tindanan (atau bingkai). Blok tindanan mengandungi status panggilan kaedah Java. Apabila benang memanggil kaedah, mesin maya Java menolak blok baharu ke tindanan Java Apabila kaedah tamat, mesin maya Java memaparkan blok yang sepadan dan membuangnya.
Mesin maya Java tidak menggunakan daftar untuk menyimpan hasil pengiraan perantaraan, tetapi menggunakan timbunan Java untuk menyimpan hasil perantaraan. Ini menjadikan arahan Mesin Maya Java lebih padat dan menjadikannya lebih mudah untuk melaksanakan Mesin Maya Java pada peranti tanpa daftar.
Timbunan Java dalam gambar sedang berkembang ke bawah dalam daftar PC berwarna kelabu kerana ia melaksanakan kaedah tempatan dan arahan pelaksanaan seterusnya tidak disimpan dalam daftar PC.
4. Jenis Data
Semua data yang digunakan dalam mesin maya Java mempunyai jenis data tertentu, dan jenis data serta operasi ditakrifkan dengan ketat dalam spesifikasi mesin maya Java. Jenis data dalam Java dibahagikan kepada jenis data primitif (jenis primitif) dan jenis data rujukan (jenis rujukan). Jenis rujukan bergantung pada objek sebenar, tetapi bukan objek itu sendiri. Jenis data primitif tidak bergantung pada apa-apa; ia mewakili data itu sendiri.
Semua jenis data primitif dalam bahasa pengaturcaraan Java adalah jenis data primitif mesin maya Java, kecuali boolean. Apabila pengkompil menyusun kod sumber Java ke dalam kodnya sendiri, ia menggunakan jenis integer (int) atau jenis bait (bait) untuk mewakili jenis Boolean. Mesin maya Java menggunakan integer 0 untuk mewakili Boolean false dan integer bukan sifar untuk mewakili Boolean true diwakili sebagai tatasusunan bait, walaupun ia mungkin disimpan dalam tatasusunan bait atau medan bit.
Kecuali Boolean, jenis primitif lain dalam bahasa Java ialah jenis data dalam mesin maya Java. Di Java, jenis data dibahagikan kepada: integer byte, short, int, long dan floating point type float, double; Jenis data dalam bahasa Java mempunyai skop yang sama pada mana-mana hos.
Dalam mesin maya Java, terdapat juga jenis nilai pulangan jenis data primitif (returnValue) yang tidak boleh digunakan dalam bahasa Java. Jenis ini digunakan untuk melaksanakan "fasal akhirnya" dalam program Java Untuk butiran, lihat "Fasal Akhirnya" dalam Bab 18.
Jenis rujukan boleh dibuat sebagai: jenis kelas, jenis antara muka, jenis tatasusunan. Kesemuanya merujuk kepada objek yang dicipta secara dinamik. Apabila jenis rujukan merujuk kepada null, ini bermakna tiada objek dirujuk.
Spesifikasi mesin maya Java hanya mentakrifkan julat yang diwakili oleh setiap jenis data, tetapi tidak menentukan ruang yang diduduki oleh setiap jenis semasa penyimpanan. Cara ia disimpan diserahkan kepada pelaksana mesin maya Java. Untuk maklumat lanjut tentang jenis titik terapung, lihat Bab 14, "Aritmetik Titik Terapung".
TypeRange
byte8-bit menandatangani integer pelengkap dua (-27 hingga 27 - 1, inklusif)
short16-bit menandatangani integer pelengkap dua (-215 hingga 215 - 1, inklusif)
int32-bit integer pelengkap dua yang ditandatangani (-231 hingga 231 - 1, inklusif)
integer pelengkap dua yang ditandatangani 64-bit (-263 hingga 263 - 1, inklusif)
aksara Unicode tidak ditandatangani char16-bit (0 hingga 216 - 1, inklusif)
float32-bit IEEE 754 single-precision float
double64-bit IEEE 754 double-precision float
returnValueaddress opcode dalam kaedah yang sama
rujukan kepada objek pada timbunan, atau null
5. Panjang bait
Kata unit data terkecil (perkataan) dalam mesin maya Java, saiznya ditentukan oleh pelaksana mesin maya Java. Tetapi saiz satu perkataan mesti cukup untuk menampung bait, pendek, int, char, float, returnValue, rujukan dua perkataan mesti cukup untuk menampung panjang, dua kali ganda. Oleh itu, pelaksana mesin maya mesti sekurang-kurangnya menyediakan perkataan yang lebih kecil daripada 31 bit, tetapi yang terbaik adalah memilih panjang perkataan yang paling cekap pada platform tertentu.
Pada masa jalanan, program Java tidak dapat menentukan panjang perkataan mesin yang sedang dijalankan. Panjang perkataan tidak menjejaskan tingkah laku program, ia hanyalah cara ekspresi dalam mesin maya Java.
6. Subsistem pemuat kelas
Terdapat dua jenis pemuat kelas dalam mesin maya Java: pemuat kelas primordial dan objek pemuat kelas. Pemuat kelas asal ialah sebahagian daripada pelaksanaan mesin maya Java, dan objek pemuat kelas ialah sebahagian daripada program yang sedang berjalan. Kelas yang dimuatkan oleh pemuat kelas yang berbeza dipisahkan oleh ruang nama yang berbeza.
Pemuat kelas memanggil banyak bahagian lain mesin maya Java dan banyak kelas dalam pakej java.lang. Sebagai contoh, objek pemuatan kelas ialah contoh subkelas java.lang.ClassLoader Kaedah dalam kelas ClassLoader boleh mengakses mekanisme pemuatan kelas dalam mesin maya setiap kelas yang dimuatkan oleh mesin maya Java akan diwakili sebagai java .lang.Class Instance kelas. Seperti objek lain, objek pemuat kelas dan objek Kelas disimpan dalam timbunan dan maklumat yang dimuatkan disimpan dalam kawasan kaedah.
1. Memuat, Memaut dan Memulakan (Memuatkan, Memaut dan Memulakan)
Subsistem pemuatan kelas bukan sahaja bertanggungjawab untuk mencari dan memuatkan fail kelas, ia melakukan banyak perkara lain mengikut langkah ketat berikut: (maklumat khusus Lihat "Kitaran Hayat Kelas" dalam Bab 7)
1), Memuatkan: Cari dan import maklumat binari bagi jenis yang ditentukan (kelas dan antara muka)
2), Sambungan: Sahkan, sediakan dan huraikan
① Pengesahan : Pastikan ketepatan jenis yang diimport
② Persediaan: Peruntukkan memori untuk jenis dan mulakan ia kepada nilai lalai
③ Parse: Parse rujukan aksara ke dalam minuman langsung
3), Initialization: Call Java kod, mulakan Pembolehubah kelas mempunyai nilai yang sesuai
2. Pemuat Kelas Primordial
Setiap mesin maya Java mesti melaksanakan pemuat kelas primitif yang boleh memuatkan pemuat yang mematuhi format fail kelas dan jenis yang dipercayai. Walau bagaimanapun, spesifikasi mesin maya Java tidak menentukan cara memuatkan kelas, yang diserahkan kepada pelaksana mesin maya Java untuk membuat keputusan. Untuk jenis dengan nama jenis yang diberikan, pemuat asal mesti mencari fail dengan nama jenis ditambah ".class" dan memuatkannya ke dalam mesin maya.
3. Objek pemuat kelas
Walaupun objek pemuat kelas adalah sebahagian daripada program Java, tiga kaedah dalam kelas ClassLoader boleh mengakses subsistem pemuatan kelas dalam mesin maya Java.
1), protected final Class defineClass(...): Gunakan kaedah ini untuk mengakses tatasusunan bait dan mentakrifkan jenis baharu.
2), protected Class findSystemClass(String name): Muatkan kelas yang ditentukan Jika ia telah dimuatkan, kembalikan terus.
3), protected final void resolveClass(Class c): Kaedah defineClass() hanya memuatkan kelas Kaedah ini bertanggungjawab untuk sambungan dinamik dan permulaan.
Untuk maklumat khusus, lihat Bab 8 "Model Penghubung".
4. Ruang nama
Apabila berbilang pemuat kelas memuatkan kelas yang sama, untuk memastikan keunikan nama mereka, pengecam pemuat kelas yang memuatkan kelas perlu ditambahkan sebelum nama kelas. Untuk maklumat khusus, lihat Bab 8 "Model Penghubung".
7. Kawasan Kaedah
Dalam mesin maya Java, maklumat jenis yang dimuatkan disimpan dalam kawasan kaedah. Bentuk organisasi maklumat ini dalam ingatan ditakrifkan oleh pelaksana mesin maya Contohnya, jika mesin maya berfungsi pada pemproses "little-endian", ia boleh menyimpan maklumat dalam format "little-endian". Dalam fail kelas Java ia disimpan dalam format "big-endian". Pereka bentuk boleh menyimpan data dalam format perwakilan yang paling sesuai untuk mesin tempatan bagi memastikan program boleh dilaksanakan pada kelajuan terpantas. Walau bagaimanapun, pada peranti dengan hanya sedikit memori, pelaksana mesin maya tidak akan menduduki sejumlah besar memori.
Semua utas dalam program berkongsi kawasan kaedah, jadi kaedah mengakses maklumat kawasan kaedah mestilah selamat untuk benang. Jika anda mempunyai dua utas memuatkan kelas yang dipanggil Lava, hanya satu utas dibenarkan untuk memuatkan kelas ini dan satu lagi mesti menunggu.
Apabila program sedang berjalan, saiz kawasan kaedah berubah-ubah, dan atur cara boleh dikembangkan semasa program sedang berjalan. Sesetengah pelaksanaan mesin maya Java juga boleh menyesuaikan saiz awal, nilai minimum dan maksimum kawasan kaedah melalui parameter.
Kaedah kawasan juga boleh dikumpul sampah. Oleh kerana kandungan dalam program dimuatkan secara dinamik oleh pemuat kelas, semua kelas mungkin menjadi tidak dirujuk. Apabila kelas menjadi keadaan ini, ia mungkin sampah dikumpul. Kelas yang tidak dimuatkan termasuk dua keadaan, satu benar-benar tidak dimuatkan dan satu lagi ialah keadaan "tidak dirujuk". Lihat Jangka Hayat Kelas dalam Bab 7 untuk butiran.
1. Maklumat Jenis (Maklumat Jenis)
Setiap jenis yang dimuatkan akan menyimpan maklumat berikut dalam kawasan kaedah dalam mesin maya Java:
1), nama penuh jenis (Nama yang layak sepenuhnya bagi jenis)
2), nama yang layak sepenuhnya bagi kelas super langsung jenis (melainkan tiada jenis induk, atau borang Frey ialah java.lang.Object) (Nama yang layak sepenuhnya bagi kelas super langsung jenis)
3), Sama ada jenis itu kelas atau antara muka (Sama ada atau tidak jenis itu kelas )
4), pengubah suai jenis (awam, persendirian, dilindungi, statik, muktamad, tidak menentu, sementara, dll.) ( Pengubah suai jenis)
5), Senarai tersusun nama berkelayakan sepenuhnya mana-mana antara muka langsung (Senarai tersusun nama-nama berkelayakan penuh mana-mana antara muka langsung)
Struktur data yang disimpan dengan nama penuh jenis ditakrifkan oleh pelaksana mesin maya. Selain itu, mesin maya Java juga menyimpan maklumat berikut untuk setiap jenis:
1), kolam malar untuk jenis (Kolam malar untuk jenis)
2), taip maklumat medan (Maklumat medan)
3), maklumat kaedah taip (Maklumat kaedah)
4), semua maklumat pembolehubah kelas statik (tidak tetap) (Semua pembolehubah kelas (statik) yang diisytiharkan dalam jenis, kecuali pemalar)
5) , a rujukan kepada kelas ClassLoader (Rujukan kepada kelas ClassLoader)
6), rujukan kepada Kelas Kelas (Rujukan kepada Kelas kelas)
1), kolam malar untuk jenis (Kolam malar untuk jenis)
Semua jenis yang disimpan dalam kolam malar tersusun set tetap, termasuk pemalar langsung (harfiah) seperti rentetan, integer dan apungan. Pemalar titik, dan rujukan simbolik kepada jenis, medan dan kaedah. Setiap pemalar yang disimpan dalam kolam pemalar mempunyai indeks, sama seperti medan dalam tatasusunan. Oleh kerana kolam malar menyimpan rujukan aksara kepada jenis, medan dan kaedah yang digunakan oleh semua jenis dalam kolam malar, ia juga merupakan objek utama sambungan dinamik. Lihat Bab 6, "Fail Kelas Java" untuk butiran.
2), taip maklumat medan (Maklumat medan)
Nama medan, jenis medan, pengubah suai medan (awam, persendirian, dilindungi, statik, muktamad, tidak menentu, sementara, dll.), medan yang ditakrifkan dalam susunan kelas.
3), taip maklumat kaedah (maklumat kaedah)
Nama kaedah, jenis nilai pulangan kaedah (atau batal), bilangan parameter kaedah, jenis dan susunannya, pengubah suai medan (awam, persendirian, dilindungi, statik, muktamad , tidak menentu, sementara, dsb.), susunan kaedah ditakrifkan dalam kelas
Jika ia bukan abstrak dan setempat, kaedah ini juga perlu menyimpan
kod bait kaedah dan saiz operan timbunan kaedah dan saiz kawasan pembolehubah setempat (perincian akan tersedia kemudian), senarai pengecualian (lihat Bab 17 "Pengecualian" untuk butiran.)
4), pembolehubah kelas (statik) (Pembolehubah Kelas)
Pembolehubah kelas Dikongsi oleh semua kejadian kelas, ia boleh diakses walaupun tanpa melalui contoh kelas. Pembolehubah ini terikat kepada kelas (bukannya kepada kejadian kelas), jadi ia adalah sebahagian daripada data logik kelas. Sebelum mesin maya Java menggunakan kelas ini, anda perlu memperuntukkan memori untuk pembolehubah kelas (bukan akhir)
Kaedah pemprosesan pemalar (akhir) adalah berbeza daripada pembolehubah kelas ini (bukan akhir). Apabila setiap jenis menggunakan pemalar, ia akan menyalinnya ke kolam pemalarnya sendiri. Pemalar juga disimpan dalam kawasan kaedah seperti pembolehubah kelas, kecuali ia disimpan dalam kolam pemalar. (Mungkin, pembolehubah kelas dikongsi oleh semua kejadian, manakala kumpulan malar adalah unik untuk setiap kejadian). Pembolehubah kelas bukan akhir disimpan sebagai sebahagian daripada data untuk jenis yang mengisytiharkannya, manakala pemalar akhir disimpan sebagai sebahagian daripada data untuk sebarang jenis yang menggunakannya. Untuk butiran, lihat Bab 6 "Fail Kelas JavaFail Kelas Java"
5), Rujukan kepada ClassLoader kelas (Rujukan kepada ClassLoader kelas)
Setiap jenis yang dimuatkan oleh mesin maya Java mesti disimpan oleh maya mesin Sama ada jenis ini dimuatkan oleh pemuat kelas asal atau pemuat kelas. Jenis yang dimuatkan oleh pemuat kelas mesti mengekalkan rujukan kepada pemuat kelas. Maklumat ini digunakan apabila pemuat kelas bersambung secara dinamik. Apabila kelas merujuk kelas lain, mesin maya mesti menyimpan bahawa jenis yang dirujuk dimuatkan oleh pemuat kelas yang sama Ini juga merupakan proses mesin maya mengekalkan ruang nama yang berbeza. Untuk butiran, lihat Bab 8 "Model Pemautan"
6), Rujukan kepada Kelas kelas (Rujukan kepada Kelas kelas)
Mesin maya Java mencipta contoh kelas java.lang.Class untuk setiap yang dimuatkan menaip. Anda juga boleh menggunakan kaedah kelas Kelas:
Kelas statik awam forName(String className) untuk mencari atau memuatkan kelas dan mendapatkan contoh kelas Kelas yang sepadan. Melalui contoh kelas Kelas ini, kita boleh mengakses maklumat dalam kawasan kaedah mesin maya Java. Untuk butiran, rujuk JavaDoc kelas Kelas.
2. Jadual Kaedah
Untuk mengakses semua data yang disimpan dalam kawasan kaedah dengan lebih cekap, struktur penyimpanan data ini mesti direka bentuk dengan teliti. Dalam semua bidang kaedah, selain daripada menyimpan maklumat asal di atas, terdapat juga struktur data yang direka untuk mempercepatkan akses, seperti senarai kaedah. Untuk setiap kelas bukan abstrak yang dimuatkan, mesin maya Java akan menjana senarai kaedah untuk mereka Senarai ini menyimpan rujukan kepada semua kaedah contoh yang mungkin dipanggil oleh kelas ini dan melaporkan ralat kepada kaedah yang dipanggil dalam kelas induk. Untuk butiran, lihat Bab 8 "Model Pautan" 8. Heap
Apabila program Java mencipta tika atau tatasusunan kelas, ia memperuntukkan memori untuk objek baharu dalam timbunan. Terdapat hanya satu timbunan dalam mesin maya, dan semua rangkaian berkongsinya.
1. Pengumpulan Sampah
Pengumpulan sampah ialah kaedah utama untuk melepaskan objek yang tidak dirujuk. Ia juga boleh menggerakkan objek ke sekeliling untuk mengurangkan pemecahan timbunan. Pengumpulan sampah tidak ditakrifkan secara ketat dalam spesifikasi mesin maya Java, tetapi ia ditakrifkan bahawa pelaksanaan mesin maya Java mesti mengurus timbunannya sendiri dalam beberapa cara. Lihat Bab 9 "Pengumpulan Sampah" untuk butiran.
2. Struktur Penyimpanan Objek (Perwakilan Objek)
Spesifikasi mesin maya Java tidak menentukan cara objek disimpan dalam timbunan. Setiap objek terutamanya menyimpan pembolehubah objek yang ditakrifkan dalam kelas dan kelas induknya. Untuk rujukan kepada objek tertentu, mesin maya mesti cepat mencari data objek ini. Di samping itu, kaedah mesti disediakan untuk merujuk data objek kaedah melalui objek, seperti rujukan objek dalam kawasan kaedah, jadi data yang disimpan oleh objek sering mengandungi beberapa bentuk penunjuk ke kawasan kaedah.
Satu reka bentuk timbunan yang mungkin adalah untuk membahagikan timbunan kepada dua bahagian: kolam rujukan dan kolam objek. Rujukan kepada objek ialah penunjuk setempat kepada kumpulan rujukan. Setiap entri dalam kumpulan rujukan mengandungi dua bahagian: penunjuk kepada data objek dalam kumpulan objek dan penunjuk kepada data kelas objek dalam kawasan kaedah. Reka bentuk ini boleh memudahkan defragmentasi timbunan mesin maya Java. Apabila mesin maya menggerakkan objek dalam kumpulan objek, ia hanya perlu mengubah suai alamat penuding dalam kumpulan rujukan yang sepadan. Tetapi setiap kali anda mengakses data objek, anda perlu memproses penunjuk dua kali. Rajah di bawah menunjukkan reka bentuk timbunan ini. Applet HeapOfFish dalam Bab 9, "Pengumpulan Sampah," menunjukkan reka bentuk ini.
Reka bentuk timbunan lain ialah: rujukan objek ialah penuding mengimbangi yang menunjuk kepada longgokan data dan menunjuk ke objek yang sepadan. Reka bentuk ini memudahkan akses objek, tetapi pergerakan objek menjadi sangat rumit. Angka berikut menunjukkan reka bentuk ini
Apabila program cuba menukar objek kepada jenis lain, mesin maya perlu menentukan sama ada penukaran adalah jenis objek atau jenis induknya. Perkara yang sama akan dilakukan apabila program menggunakan pernyataan instanceof. Apabila program memanggil kaedah objek, mesin maya perlu melakukan pengikatan dinamik, dan ia mesti menentukan jenis kaedah untuk dipanggil. Ini juga memerlukan penghakiman di atas.
Tidak kira reka bentuk yang digunakan oleh pelaksana mesin maya, dia mungkin menyimpan maklumat yang serupa dengan senarai kaedah untuk setiap objek. Kerana ia boleh meningkatkan kelajuan panggilan kaedah objek, adalah sangat penting untuk meningkatkan prestasi mesin maya Walau bagaimanapun, tidak ada keperluan dalam spesifikasi mesin maya bahawa struktur data yang serupa mesti dilaksanakan. Rajah di bawah menggambarkan struktur ini. Rajah menunjukkan semua struktur data yang dikaitkan dengan rujukan objek, termasuk:
1), penunjuk untuk menaip data
2), dan senarai kaedah objek. Senarai kaedah ialah tatasusunan penunjuk kepada semua kaedah yang boleh dipanggil pada objek. Data kaedah termasuk tiga bahagian: saiz timbunan opcode dan kawasan pembolehubah setempat bagi timbunan kaedah; dan senarai pengecualian.
Setiap objek dalam mesin maya Java mesti dikaitkan dengan kunci (mutex) yang digunakan untuk menyegerakkan berbilang benang. Pada masa yang sama, hanya satu objek boleh memegang kunci objek ini. Apabila seseorang memiliki kunci objek ini, dia boleh memohon kunci itu beberapa kali, tetapi dia juga mesti melepaskan kunci itu beberapa kali yang sepadan sebelum dia benar-benar boleh melepaskan kunci objek itu. Banyak objek tidak dikunci sepanjang hayatnya, jadi maklumat ini hanya perlu ditambah apabila diperlukan. Banyak pelaksanaan mesin maya Java tidak menyertakan "data kunci" dalam data objek dan hanya menjana data yang sepadan apabila diperlukan. Selain melaksanakan penguncian objek, setiap objek juga secara logiknya dikaitkan dengan pelaksanaan "set tunggu". Mengunci membantu utas memproses data yang dikongsi secara bebas tanpa mengganggu urutan lain. "Tetapkan tunggu" membantu urutan kumpulan bekerjasama untuk mencapai matlamat yang sama. "Set tunggu" sering dilaksanakan melalui kaedah wait() dan notify() kelas Objek.
Pengumpulan sampah juga memerlukan maklumat tentang sama ada objek dalam timbunan dikaitkan. Spesifikasi Mesin Maya Java menyatakan bahawa kutipan sampah menjalankan kaedah pemuktamadkan objek sekali, tetapi membenarkan kaedah pemuktamadkan merujuk semula objek Apabila objek tidak dirujuk semula, tidak perlu memanggil kaedah pemuktamad lagi. Oleh itu, mesin maya juga perlu menyimpan maklumat sama ada kaedah muktamad telah dijalankan. Untuk maklumat lanjut, lihat "Pengumpulan Sampah" dalam Bab 9
3. Penyimpanan Array (Perwakilan Tatasusunan)
Dalam Java, tatasusunan ialah objek lengkap Ia disimpan dalam timbunan seperti objek merujuk kepada contoh kelas Kelas. Semua tatasusunan dengan dimensi dan jenis yang sama mempunyai Kelas yang sama, dan panjang tatasusunan tidak dipertimbangkan. Nama yang sepadan dengan Kelas dinyatakan sebagai dimensi dan jenis. Contohnya, nama Kelas bagi data integer ialah "[I", nama Kelas tatasusunan bait tiga dimensi ialah "[[[B", dan nama Kelas bagi data objek dua dimensi ialah "[[Ljava. lang.Objek".
Tatasusunan berbilang dimensi diwakili sebagai tatasusunan tatasusunan, seperti yang ditunjukkan di bawah:
Tatasusunan mesti menyimpan panjang tatasusunan, data tatasusunan dan beberapa rujukan kepada data jenis tatasusunan objek dalam timbunan. Melalui rujukan tatasusunan, mesin maya seharusnya dapat memperoleh panjang tatasusunan, mengakses data tertentu melalui pengindeksan, dan kaedah panggilan yang ditakrifkan oleh Objek. Objek ialah kelas induk langsung semua kelas data. Lihat Bab 6, "Fail Kelas" untuk maklumat lanjut.
9. Daftar PC (Kaunter Program) (Kaunter Program)
Kaunter program akan dibuat apabila setiap utas mula dilaksanakan. Kaunter program hanya satu perkataan panjang, jadi ia boleh memegang penunjuk tempatan dan returnValue. Apabila utas dilaksanakan, kaunter program menyimpan alamat arahan yang sedang dilaksanakan Alamat ini boleh menjadi penunjuk setempat atau penuding mengimbangi bermula dari kod bait kaedah. Jika kaedah asli dilaksanakan, nilai pembilang program tidak ditentukan.
10. Java Stack
Apabila thread bermula, mesin maya Java mencipta tindanan Java untuknya. Timbunan Java menggunakan beberapa kelas bingkai diskret untuk merekodkan status benang. Timbunan mesin maya Java Terdapat hanya dua operasi pada tindanan Java: bingkai menolak dan meletus.
Kaedah yang dilaksanakan dalam benang dipanggil kaedah semasa, dan bingkai yang sepadan dengan kaedah semasa dipanggil bingkai semasa. Kelas yang mentakrifkan kaedah semasa dipanggil kelas semasa, dan kumpulan malar kelas semasa dipanggil kolam malar semasa. Apabila thread dilaksanakan, mesin maya Java menjejaki kelas semasa dan kumpulan malar semasa. Tetapi apabila benang beroperasi pada data yang disimpan dalam bingkai, ia hanya beroperasi pada data bingkai semasa.
Apabila benang memanggil kaedah, mesin maya menjana bingkai baharu dan menolaknya ke dalam tindanan Java benang. Bingkai baharu ini menjadi bingkai semasa. Apabila kaedah dilaksanakan, ia menggunakan bingkai semasa untuk menyimpan parameter kaedah, pembolehubah tempatan, struktur perantaraan dan data lain. Kaedah mempunyai dua cara untuk keluar: keluar biasa dan keluar tidak normal. Tidak kira dengan cara mana kaedah itu dilancarkan, mesin maya Java akan muncul dan membuang bingkai kaedah, dan bingkai kaedah sebelumnya menjadi bingkai semasa.
Semua data yang disimpan dalam bingkai hanya boleh diakses oleh benang yang memilikinya. Benang tidak boleh mengakses data dalam susunan benang lain. Oleh itu, apabila mengakses pembolehubah tempatan sesuatu kaedah, tidak perlu mempertimbangkan penyegerakan berbilang benang.
Seperti kawasan kaedah dan timbunan, timbunan Java tidak memerlukan ruang memori berterusan Ia boleh disimpan dalam ruang ingatan yang tersebar atau pada timbunan. Data khusus dan panjang timbunan ditentukan oleh pelaksana mesin maya Java. Sesetengah pelaksanaan mungkin menyediakan kaedah untuk melaksanakan pemaksimaman dan pengecilan tindanan.
11. Bingkai Tindanan
Bingkai tindanan mengandungi tiga bahagian: pembolehubah tempatan, tindanan operan dan data bingkai. Saiz pembolehubah tempatan dan tindanan operan diukur dalam perkataan, dan ia ditentukan semasa penyusunan. Saiz data bingkai bergantung pada pelaksanaan yang berbeza. Apabila program memanggil kaedah, mesin maya memperoleh saiz pembolehubah tempatan dan tindanan operan daripada data kelas, mencipta saiz dan bingkai yang sesuai, dan kemudian menolaknya ke tindanan Java.
1. Pembolehubah Setempat
Pembolehubah setempat disusun sebagai tatasusunan yang mengira dari 0 dalam bingkai timbunan Java Arahan memperoleh nilai yang sepadan daripada kawasan pembolehubah setempat dengan menyediakan indeksnya. Int, float, reference, returnValue menduduki satu perkataan, byte, short, char ditukar kepada int dan kemudian disimpan, long dan doublel menduduki dua perkataan. Arahan
memperoleh nilai panjang atau berganda dengan menyediakan indeks pertama daripada dua perkataan. Sebagai contoh, jika nilai panjang disimpan pada indeks 3 atau 4, arahan boleh memperoleh nilai panjang melalui 3.
Kawasan pembolehubah setempat mengandungi parameter kaedah dan pembolehubah setempat. Pengkompil meletakkan parameter kaedah di hadapan tatasusunan dalam susunan di mana ia diisytiharkan. Walau bagaimanapun, pengkompil boleh menyusun pembolehubah tempatan secara sewenang-wenangnya dalam tatasusunan pembolehubah tempatan, malah dua pembolehubah tempatan boleh berkongsi alamat yang sama Contohnya, apabila dua pembolehubah tempatan berada dalam dua kawasan tidak bertindih, seperti pembolehubah gelung i,j .
Pelaksana mesin maya boleh menggunakan sebarang struktur untuk menerangkan data dalam kawasan pembolehubah setempat Spesifikasi mesin maya tidak menentukan cara menyimpan panjang dan berganda.
2. Tindanan Operand (Timbunan Operan)
Seperti pembolehubah tempatan, tindanan operan juga disusun dalam tatasusunan dalam unit perkataan. Tetapi ia tidak diakses melalui indeks seperti pembolehubah tempatan, tetapi melalui nilai push dan pop. Jika satu arahan menolak nilai ke dalam tindanan, arahan seterusnya boleh muncul dan menggunakan nilai tersebut.
Berbeza dengan pembilang program, tindanan operan tidak boleh diakses secara langsung melalui arahan boleh terus mengakses tindanan operan. Mesin maya Java adalah berasaskan tindanan dan bukannya berasaskan daftar kerana arahannya memperoleh operan daripada tindanan dan bukannya dari daftar yang sama. Sudah tentu, arahan juga boleh mendapatkan operan dari tempat lain, seperti opcode selepas arahan, atau kumpulan tetap. Tetapi arahan mesin maya Java terutamanya mendapatkan operan yang mereka perlukan daripada timbunan operan.
Mesin maya Java menganggap tindanan operan sebagai kawasan kerja Banyak arahan mengeluarkan nilai daripada tindanan operan dahulu, dan kemudian menolak hasilnya kembali ke tindanan operan selepas diproses. Proses pelaksanaan arahan tambah ditunjukkan dalam rajah di bawah: mula-mula laksanakan arahan iload_0 dan iload_1 untuk mengambil dua nombor yang perlu ditambah dari kawasan kaedah tempatan dan menolaknya ke tindanan operan kemudian laksanakan arahan iadd dan sekarang pop Keluarkan dua nilai, tambahkannya, dan tolak hasilnya ke dalam tindanan operan, akhirnya laksanakan arahan istore_2, keluarkan hasilnya, dan tetapkan ia ke kawasan kaedah setempat.
3. Data Bingkai
Selain memproses pembolehubah tempatan dan tindanan operan, bingkai tindanan java juga termasuk data yang diperlukan untuk menyokong kumpulan tetap, nilai pulangan kaedah dan pengedaran data bingkai.
Apabila mesin maya menemui arahan yang menggunakan rujukan kepada kumpulan malar, ia akan mengakses maklumat yang diperlukan melalui penuding ke kawasan malar dalam data bingkai. Seperti yang dinyatakan sebelum ini, rujukan dalam kawasan malar adalah rujukan simbolik pada permulaan. Walaupun mesin maya menyemak rujukan ini, ia adalah rujukan aksara. Jadi mesin maya perlu menukar rujukan ini pada masa ini.
Apabila kaedah kembali normal, mesin maya perlu membina semula bingkai tindanan kaedah yang dipanggil kaedah ini. Jika kaedah yang dilaksanakan mempunyai nilai pulangan, mesin maya perlu menolak nilai ini ke dalam tindanan operan kaedah panggilan.
Data bingkai juga mengandungi rujukan kepada jadual pengecualian yang digunakan oleh mesin maya untuk mengendalikan pengecualian. Jadual pengecualian mentakrifkan bahagian kod bait yang dilindungi oleh kenyataan tangkapan. Setiap individu dalam jadual pengecualian juga mengandungi julat bytecode yang perlu dilindungi dan lokasi bytecode yang perlu dilaksanakan apabila pengecualian ditangkap. Apabila kaedah melontar pengecualian, mesin maya Java menggunakan jadual pengecualian untuk menentukan cara mengendalikan pengecualian. Jika mesin maya menemui tangkapan yang sepadan, ia akan memindahkan kawalan kepada pernyataan tangkapan. Jika tiada tangkapan sepadan ditemui, kaedah akan kembali secara tidak normal, dan kemudian meneruskan proses dalam kaedah panggilan.
Selain daripada tiga kegunaan di atas, data bingkai mungkin juga mengandungi beberapa data yang bergantung kepada pelaksanaan, seperti maklumat penyahpepijatan.
12. Timbunan kaedah setempat
Kawasan kaedah setempat bergantung pada pelaksanaan mesin maya yang berbeza. Pelaksana mesin maya boleh memutuskan mekanisme mana yang hendak digunakan untuk melaksanakan kaedah asli.
Mana-mana Antara Muka Kaedah Asli menggunakan beberapa bentuk susunan kaedah asli.
13. Enjin pelaksanaan
Inti pelaksanaan mesin maya Java ialah enjin pelaksanaan. Dalam Spesifikasi Mesin Maya Java, enjin pelaksanaan diterangkan sebagai urutan arahan. Untuk setiap arahan, spesifikasi menerangkan perkara yang harus mereka lakukan, tetapi bukan cara melakukannya.
1. Set arahan
Dalam mesin maya Java, aliran kod bait sesuatu kaedah ialah urutan arahan. Setiap arahan terdiri daripada kod operasi bait (Opcode) dan kemungkinan operan (Operan). Opcode memberitahu apa yang perlu dilakukan, dan operan menyediakan beberapa maklumat tambahan yang mungkin diperlukan untuk melaksanakan opcode. Enjin pelaksanaan abstrak melaksanakan satu arahan pada satu masa. Proses ini berlaku dalam setiap urutan pelaksanaan.
Kadangkala, enjin pelaksanaan mungkin menghadapi arahan yang memerlukan panggilan kaedah tempatan Dalam kes ini, enjin pelaksanaan akan cuba memanggil kaedah tempatan, tetapi apabila kaedah tempatan kembali, enjin pelaksanaan akan terus melaksanakan kod bait. aliran. Kaedah asli juga boleh dilihat sebagai pengembangan set arahan dalam mesin maya Java.
Memutuskan arahan yang akan dilaksanakan seterusnya juga merupakan sebahagian daripada kerja enjin pelaksanaan. Enjin pelaksanaan mempunyai tiga kaedah untuk mendapatkan arahan seterusnya. Kebanyakan arahan akan melaksanakan arahan yang mengikutinya; beberapa arahan seperti goto dan pulangan akan menentukan arahan seterusnya apabila ia dilaksanakan apabila arahan melemparkan pengecualian, enjin pelaksanaan menentukan arahan seterusnya dengan memadankan arahan yang sepatutnya dilaksanakan.
Kebebasan platform, mobiliti rangkaian dan keselamatan mempengaruhi reka bentuk set arahan mesin maya Java. Kebebasan platform adalah salah satu faktor utama yang mempengaruhi dalam reka bentuk set arahan. Struktur berasaskan tindanan membolehkan mesin maya Java dilaksanakan pada lebih banyak platform. Opcode yang lebih kecil dan struktur padat membolehkan bytecodes menggunakan lebar jalur rangkaian dengan lebih cekap. Pengesahan bytecode sekali sahaja menjadikan bytecode lebih selamat tanpa menjejaskan terlalu banyak prestasi.
2. Teknologi pelaksanaan
Banyak teknologi pelaksanaan boleh digunakan dalam pelaksanaan mesin maya Java: pelaksanaan yang ditafsirkan, penyusunan tepat dalam masa, penyusunan titik panas, pelaksanaan asli dalam silikon.
3. Benang
Spesifikasi mesin maya Java mentakrifkan model benang untuk pelaksanaan pada lebih banyak platform. Satu matlamat model benang Java adalah untuk memanfaatkan benang asli. Menggunakan benang tempatan membolehkan benang dalam program Java dilaksanakan serentak pada mesin berbilang pemproses.
Salah satu kos model penjalinan Java ialah keutamaan benang Java boleh dijalankan pada tahap keutamaan 1-10. 1 adalah yang paling rendah dan 10 adalah yang tertinggi. Jika pereka bentuk telah menggunakan urutan asli, mereka mungkin telah memetakan 10 keutamaan ini kepada keutamaan tempatan. Spesifikasi mesin maya Java hanya mentakrifkan bahawa utas dengan keutamaan yang lebih tinggi boleh mendapatkan sedikit masa CPU, dan utas dengan keutamaan yang lebih rendah juga boleh mendapatkan sedikit masa CPU apabila semua utas keutamaan tinggi disekat, tetapi tiada jaminan: keutamaan rendah Benang tidak dapat jumlah masa CPU tertentu apabila benang keutamaan tinggi tidak disekat. Oleh itu, jika anda perlu bekerjasama antara benang yang berbeza, anda mesti menggunakan "synchronizatoin".
Penyegerakan bermaksud dua bahagian: penguncian objek dan benang tunggu dan beritahu. Kunci objek membantu utas kekal bebas daripada gangguan daripada utas lain. Benang menunggu dan pengaktifan membenarkan benang yang berbeza untuk bekerjasama.
Dalam spesifikasi mesin maya Java, benang Java diterangkan sebagai pembolehubah, memori utama dan memori kerja. Setiap contoh mesin maya Java mempunyai memori utama, yang mengandungi semua pembolehubah program: objek, tatasusunan dan pembolehubah kelas. Setiap utas mempunyai memori kerja sendiri, dan ia menyimpan salinan pembolehubah yang mungkin digunakan. Peraturan:
1), salin nilai pembolehubah dari memori utama ke memori kerja
2), tulis nilai dalam memori kerja ke memori utama
Jika pembolehubah tidak disegerakkan, thread boleh Kemas kini pembolehubah dalam ingatan utama dalam sebarang susunan. Untuk memastikan pelaksanaan program berbilang benang yang betul, mekanisme penyegerakan mesti digunakan.
14. Antara Muka Kaedah Asli (Antara Muka Kaedah Asli)
Pelaksanaan mesin maya Java tidak perlu melaksanakan antara muka kaedah asli. Sesetengah pelaksanaan mungkin tidak menyokong antara muka kaedah asli sama sekali. Antara muka kaedah asli Sun ialah JNI (Antaramuka Asli Java).
15. Mesin Sebenar (Mesin Sebenar)
16. Kaedah Matematik: Simulasi (Eternal Math: A Simulation)
Atas ialah kandungan terperinci Pengenalan kepada titik pengetahuan Java Virtual Machine (JVM). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!