Light Mode

Kontent qismiga o`tish

Java Virtual Machine

Vikipediya, erkin ensiklopediya
JVM(Java virtual mashinasi)
Java dasturlash tilida yozilgan kodlarni ishga tushirish uchun qo'llaniladigan virtual mashina

JVM -- Java ekotizimining yadrosi bo`lib, Javaga asoslangan dasturiy ta'minotlarga "bir marta yozing, istalgan joyda ishga tushiring" yondashuviga amal qilish imkonini beradi. Java kodini bitta mashinada yozishingiz va uni JVM yordamida istalgan boshqa mashinada ishga tushirishingiz mumkin. JVM dastlab faqat Javani qo`llab-quvvatlash uchun ishlab chiqilgan edi. Biroq, vaqt o`tishi bilan Java platformasida Scala, Kotlin va Groovy kabi ko`plab boshqa tillarni ham ishga tushirish imkoni tug`ildi. Bu tillarning barchasi birgalikda JVM tillari deb nomlanadi.[1]

Java virtual mashinasi nima?

[tahrir | manbasini tahrirlash]

C va C++ kabi dasturlash tillarida kod dastlab platformaga xos mashina kodiga kompilyatsiya qilinadi. Bu tillar kompilyatsiya qilingan yoki kompilyater tillar deb ataladi. Boshqa tomondan, JavaScript va Python kabi tillarda kompyuter ko`rsatmalarni kompilyatsiya qilmasdan to`g`ridan-to`g`ri bajaradi. Bu tillar izohli yoki interpreter tillar deb ataladi. Java ikkala texnikaning kombinatsiyasidan foydalanadi. Java kodi klass faylini yaratish uchun avval maxsus java bayt kodga kompilyatsiya qilinadi. Keyinchalik bu klass fayli asosiy platforma uchun Java virtual mashinasi tomonidan ishga tushiriladi. Xuddi shu klass fayl har qanday platforma va operatsion tizimda ishlaydigan JVM ning istalgan versiyasida ishga tushirilishi mumkin. Virtual mashinalarga o`xshab, JVM host mashinasida ya'ni JVM o`rnatilgan mashinada o`zi uchun alohida joy yaratadi. Bu maydon platforma yoki mashinaning operatsion tizimidan qat'i nazar, Java dasturlarini ishga tushirish uchun ishlatilishi mumkin.

Java virtual mashinasi arxitekturasi

[tahrir | manbasini tahrirlash]

JVM uchta alohida komponentdan iborat:

  • klasslarni yuklovchi qism yani klassloaderlar(ingliz tilida classloaders deb ataladi)
  • amalga oshirish jarayonidagi ma'lumotlarni saqlovchi xotira qism (ingliz tilida runtime memory areas deyiladi)
  • amallarni bajaruvchi qism(ingliz tilida execution engine deyiladi)

Klasslarni xotiraga yuklovchilar (classloaders)

[tahrir | manbasini tahrirlash]

Klassloaderlarning asosiy vazifa programmadagi klasslarni java virtual mashinasi tomonidan ishlatilinishi kerak bo`lgan vaqtda xotiraga yuklashdan iborat. Javada bir nechta klass turlari mavjud. Masalan java dasturlash tilida oldindan yaratilgan klasslar yoki tashqi kutubxonalardan chaqirilgan klasslar va dasturchi tomonidan yaratilgan klasslar kabi klass turlari mavjud. Shu jihatdan JVM da 3 xil klassloaderlar mavjud. Bular quyidagicha:

  • Bootstrap klassloaderlar
  • Extension klassloaderlar
  • Sistema klassloaderlari

Bootstrap klassloaderlar -- bu klassloaderlar java dasturlash tilida oldindan yaratilgan yoki bo`lmasam kompyuter xotirasida JAVA/JRE/LIB yo`lida joylashgan klass fayllarni yuklash uchun ishlatilinadi. Bu klassloader barcha klasslaoderlarning otasi hisoblanadi.

Extension klassloader -- bu klassloader tashqaridan yuklangan ekstentionlar ya'ni kutubxonalardagi klasslarni yuklaydi. Bu klassloader JAVA/JRE/LIB/EXT yo`lidagi klasslarni xotiraga yuklaydi.

Application klassloader(sistema klassloaderi) -- bu klassloader dasturchi tomonidan yaratilgan yoki classpath yo`lidagi klasslarni yuklash uchun ishlatilinadi.[2]

Klasslarni yuklovchilarning uchta asosiy vazifasi, klassning yuklanish bosqichlari

[tahrir | manbasini tahrirlash]

Klassloaderlarning asosiy uchta vazifasi bor, bular:

  • Klasslarni yuklash(Loading)
  • Bog`lash(Linking)
  • Initializatsiya(Ishga tushirish)


Birinchi qadamda classloader ,,.class" kengaytmali faylni o`qiydi va unga mos ikkilik ma'lumot ishlab chiqib uni method area deb nomlangan xotiraga saqlaydi. Har bir klass fayl uchun JVM quyidagi ma'lumotlarni xotiraga saqlaydi:

  • Yuklangan klass faylning to`liq nomi va uning ota klassi nomi
  • Klass faylning turi, u klassmi, interfeysmi yoki enum turidagi faylmi, shu haqidagi ma'lumot
  • Klass faylda joylashgan o`zgaruvchilar, metodlar va shunga o`xshash ma'lumot


Klass fayl yuklangandan so`ng, JVM heap memory deb ataluvchi xotirada Class tipidagi bu klass haqidagi ma'lumotlarni ko`rsatib turish uchun obyekt yaratadi. Bu klass obyekti dasturchi tomonidan klass haqidagi ma'lumotar, masalan, nomi, metodlari va boshqalarni olish uchun ishlatilinadi.
Ikkinchi qadam bog`lash deb nomlanadi va bunda .class faylni yaroqli kompilyator tomonidan kompilyatsiya qilinganligi tekshiriladi. Agar qandaydir xatolik bo`lsa verifikatsiyada xatolik deb ataluvchi verificationexception xatoligini tashlaydi. Bundan tashqari klass fayldagi statik o`zgaruvchilarni dastlabki(default) qiymatlari beriladi. Shu bilan birga, simbollar orqali bog`lanishlarni bevosita bog`lanishlarga almashtiriladi. Masalan, klass nomining o`rniga xotirada joylashgan nomi ishlatilinadi.
Uchinchi qadamda esa ishga tushirish jarayoni bo`ladi ya'ni kodda berilgan statik o`zgaruvchilarni qiymati belgilanadi va klass ichidagi statik blok ichida yozilgan kod ishga tushiriladi. [3]

Klasslarning yuklanish mexanizmi

[tahrir | manbasini tahrirlash]
java classloader mechanism

Javada klass maxsus ,,Delegation-Hierarchy" prinsipiga amal qilgan holda yuklanadi. Qachonki, jvm dastur ishlash jarayonida biron bir klassga duch kelsa, avvalo, xotiradan bu klass yuklangan yoki yo`qligini tekshiradi. Agar yuklangan bo`lsa foydalanadi, aks holda, klassloaderlarga murojaat qiladi, so`rov birinchi navbatda application klassloaderga keladi, bu klassloader so`rovni extension klassloaderga jo`natadi, extension klassloader esa bootstrap klassloaderga yuboradi. Bootstrap klassloader o`zi mas'ul bo`lgan papkani qaraydi, agar klassni topsa, uni yuqorida ko`rsatilgan tartibda yuklaydi, aks holda, so`rov yana extension klassloaderga keladi, u ham o`zi mas'ul bo`lgan papkalar orasidan klass faylni qidiradi, agar fayl topilsa yuklanadi, aks holda, application klassloaderga so`rov jo`natiladi, agar bu klassloader ham klass faylni topa olmasa, JVM tomonidan classNotFoundException deb ataluvchi xatolik qaytariladi.[4]

Amallarni bajaruvchi komponenta(Execution engine)

[tahrir | manbasini tahrirlash]

Amallarni bajaruvchi komponenta ham o`z navbatida uchta qismga bo`linadi, bular:

  • Interpretator
  • JIT (Just in time -- inglizcha, ayni vaqtda) kompilyator
  • Garbage collector (xotira tozalovchi)

Interpretator -- xotiraga yuklangan klassdagi bayt kodlarni qatorma-qator o`qiydi va kodni ishga tushiradi. Buni asosiy kamchiligi, kodlarni har safar qayta va qayta kompilyatsiya qilinishidadir.
JIT kompilyator -- buning asosiy vazifasi jvmda ish jarayonini tezlashtirish va optimizatsiya qilish hisoblanadi. JIT ning ustunlik beruvchi tarafi bu agar bayt kod oldin kompilyatsiya qilingan bo`lsa, qaytadan qilmasdan o`sha kompilyatsiya qilingan kodni ishga tushiradi va bu amallar bajarilish jarayoni sezilarli darajada tezlashishiga sabab bo`ladi.[5]
Garbage collector -- bu xotirani optimizatsiya qilishga yordam beradi, ya'ni xotiradagi qiymat yo`q bo`lin qolgan(,,null" bo`lgan) yoki boshqa obyektlar bilan bog`lanishi yo`qolgan obyektlarni heap xotirasidan tozalab turadi. Bu esa xotira to`lib qolishini oldini oladi. Ba'zi C, Fortan, Pascal kabi tillarda bu jarayon dasturchilar tomonidan qo`lda amalga oshiriladi. Shuning uchun, avtomatik xotira tozalanishi javaning boshqa tillardan ustunlik qiladigan muhim jihatlaridan biridir.[6]