Apakah Mesin Maya Java (JVM) dan bagaimana ia berfungsi secara dalaman?
Mesin Maya Java (JVM) adalah komponen kritikal dari Java Runtime Environment (JRE) yang membolehkan komputer menjalankan program Java. JVM adalah platform bebas, yang bermaksud ia boleh menjalankan java bytecode pada mana-mana peranti atau sistem operasi yang mempunyai pelaksanaan JVM. JVM bertindak sebagai perantara antara bytecode Java dan perkakasan yang mendasari, memastikan aplikasi Java dapat dilaksanakan tanpa memerlukan rekompilasi pada platform yang berbeza.
Secara dalaman, JVM berfungsi melalui beberapa fasa utama:
- Memuatkan: Apabila program Java dilaksanakan, JVM pertama memuatkan fail
.class
yang mengandungi bytecode. Subsistem ClassLoader bertanggungjawab memuatkan fail ini ke dalam memori.
- Pengesahan: Setelah dimuatkan, bytecode disahkan untuk memastikan ia tidak melanggar kekangan keselamatan atau integriti Java. Langkah ini membantu mencegah kod jahat daripada dilaksanakan.
- Penyediaan: Dalam fasa ini, JVM memperuntukkan memori untuk pembolehubah kelas dan memulakannya kepada nilai lalai mereka.
- Resolusi: Ini melibatkan menyelesaikan rujukan simbolik dari kod untuk mengarahkan rujukan. JVM mungkin perlu memuat kelas tambahan semasa fasa ini.
- Inisialisasi: Inisialisasi sebenar pembolehubah statik dan pelaksanaan blok permulaan statik berlaku semasa fasa ini.
- Pelaksanaan: JVM melaksanakan arahan bytecode menggunakan enjin pelaksanaan. Enjin pelaksanaan boleh terdiri daripada penterjemah dan pengkompil yang tepat (JIT). Jurubahasa membaca dan melaksanakan arahan bytecode satu demi satu, sedangkan pengkompil JIT menerjemahkan bytecode ke dalam kod mesin asli untuk pelaksanaan yang lebih cepat.
- Koleksi Sampah: JVM menguruskan peruntukan memori dan deallocation, memastikan ingatan yang tidak lagi diperlukan ditebus melalui pengumpulan sampah.
Apakah komponen utama JVM dan fungsi mereka?
JVM terdiri daripada beberapa komponen utama, masing -masing melayani fungsi tertentu:
- Subsistem Loader Kelas: Komponen ini bertanggungjawab untuk memuatkan, menghubungkan, dan memulakan kelas dan antara muka. Ia menggunakan pendekatan hierarki untuk memuat kelas dari sumber yang berbeza (contohnya, sistem fail tempatan, lokasi rangkaian).
-
Kawasan Data Runtime (Kawasan Memori): Ini termasuk beberapa kawasan memori yang digunakan semasa pelaksanaan program:
- Kawasan Kaedah: Menyimpan struktur kelas seperti Runtime Constant Pool, Field, and Method Data.
- Kawasan Heap: Kedai objek dan dikongsi di antara semua benang.
- Kawasan Stack: Mengandungi bingkai di mana pembolehubah tempatan dan hasil separa disimpan. Setiap benang mempunyai timbunan sendiri.
- Daftar PC: Memegang alamat arahan semasa yang dilaksanakan oleh benang.
- Kaedah asli timbunan: Sama seperti kawasan timbunan tetapi digunakan untuk kaedah asli.
-
Enjin Pelaksanaan: Komponen ini melaksanakan arahan bytecode. Ia termasuk:
- Jurubahasa: Melaksanakan Bytecode One Arahan pada satu masa.
- Pengkompil Just-in-Time (JIT): Menyusun Bytecode ke dalam kod mesin asli untuk pelaksanaan yang lebih cepat.
- Pemungut Sampah: Menguruskan memori dengan menuntut semula objek yang tidak lagi digunakan.
- Java Native Interface (JNI): Membolehkan kod Java dipanggil dan dipanggil oleh aplikasi asli dan perpustakaan yang ditulis dalam bahasa lain seperti C, C, dan pemasangan.
- Perpustakaan kaedah asli: Koleksi perpustakaan asli yang diperlukan oleh JVM untuk menyokong pelaksanaan kaedah asli.
Bagaimanakah JVM menguruskan memori dan melakukan koleksi sampah?
Pengurusan memori dalam JVM melibatkan peruntukan dan deallocation memori dalam kawasan data runtime, terutamanya timbunan dan timbunan. Begini bagaimana JVM menguruskan ingatan:
-
Peruntukan Memori:
- Memori Stack: Digunakan untuk menyimpan pembolehubah tempatan dan butiran penyerahan kaedah. Memori diperuntukkan dan deallocated secara automatik sebagai kaedah dipanggil dan dikembalikan.
- Memori Heap: Digunakan untuk menyimpan objek. Memori diperuntukkan apabila objek baru dicipta dan masih digunakan sehingga mereka tidak lagi dirujuk.
-
Koleksi Sampah:
-
JVM menggunakan koleksi sampah untuk mengurus memori timbunan secara automatik dengan mengenal pasti dan mengeluarkan objek yang tidak lagi dirujuk. Proses ini melibatkan:
- Tanda fasa: Pemungut sampah mengenal pasti objek yang masih digunakan (dapat dicapai) dengan mengesan semua rujukan dari akar (pembolehubah global, pembolehubah timbunan, dll.).
- Fasa sapu: Pemungut sampah menuntut semula memori yang diduduki oleh objek yang dikenal pasti sebagai sampah dalam fasa tanda.
- Fasa padat (pilihan): Sesetengah pengumpul sampah bergerak objek yang masih hidup untuk menyatukan ruang kosong dan mengurangkan pemecahan.
-
Algoritma pengumpulan sampah biasa termasuk:
- Serial GC: Sesuai untuk persekitaran tunggal.
- GC selari: Menggunakan pelbagai benang untuk pengumpulan sampah untuk meningkatkan prestasi.
- Mark Sweep Sweep (CMS) GC: Meminimumkan jeda dalam aplikasi dengan melaksanakan sebahagian besar kerjanya serentak dengan benang aplikasi.
- Sampah-pertama (G1) GC: Direka untuk kawasan memori timbunan besar, mengimbangi masa jeda dan throughput.
Apakah pengoptimuman yang digunakan oleh JVM untuk meningkatkan prestasi aplikasi Java?
JVM menggunakan beberapa pengoptimuman untuk meningkatkan prestasi aplikasi Java:
-
Kompilasi Just-in-Time (JIT):
- JVM menggunakan kompilasi JIT untuk menterjemahkan bytecode ke dalam kod mesin asli semasa runtime. Ini menghasilkan peningkatan prestasi yang signifikan kerana kod yang disusun dilaksanakan lebih cepat daripada bytecode yang ditafsirkan.
-
Berbeza:
- Penyusun JIT boleh menyamakan kaedah kecil ke dalam kaedah panggilan untuk mengurangkan overhead panggilan kaedah. Pengoptimuman ini dapat meningkatkan prestasi dengan ketara, terutamanya dalam kaedah yang sering dipanggil.
-
Gelung membongkar:
- Penyusun JIT boleh membuka gelung untuk mengurangkan overhead kawalan gelung dan berpotensi membolehkan pengoptimuman lain. Ini dapat meningkatkan prestasi dengan melaksanakan lebih banyak lelaran gelung dalam satu lelaran gelung tunggal.
-
Penghapusan Kod Mati:
- Pengkompil JIT boleh mengesan dan mengeluarkan kod yang tidak pernah dilaksanakan, mengurangkan saiz kod yang disusun dan meningkatkan prestasi runtime.
-
Analisis melarikan diri:
- Teknik ini menganalisis sama ada objek boleh diperuntukkan pada timbunan dan bukannya timbunan, berpotensi mengurangkan keperluan pengumpulan sampah dan meningkatkan prestasi.
-
Pengoptimuman Adaptif:
- JVM terus memantau prestasi aplikasi dan secara dinamik menyesuaikan strategi pengoptimumannya. Sebagai contoh, ia mungkin menyusun kaedah yang sering dilaksanakan kepada kod asli sementara meninggalkan kod kurang kritikal untuk ditafsirkan.
-
Pengoptimuman berpandu profil:
- JVM menggunakan data profil runtime untuk membimbing keputusan pengoptimumannya. Ini termasuk frekuensi penyerahan kaedah penjejakan dan ramalan cawangan untuk memfokuskan usaha pengoptimuman di bahagian paling kritikal aplikasi.
Pengoptimuman ini membolehkan JVM untuk meningkatkan prestasi aplikasi Java dengan ketara dengan menyesuaikan diri dengan ciri -ciri runtime tertentu dan corak beban kerja kod yang dilaksanakan.
Atas ialah kandungan terperinci Apakah Mesin Maya Java (JVM) dan bagaimana ia berfungsi secara dalaman?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan:Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn