JIT: mohiyati, Just-In-Time kompilyatsiyasi va qanday ishlaydi

Muallif: IT Sectr Nashr etilgan: 2026-04-16 O'qish vaqti: 9 daq

JIT (Just-In-Time) — bayt-kodni yoki dasturning oraliq ko'rinishini to'g'ridan-to'g'ri bajarish vaqtida mashina ko'rsatmalariga aylantiruvchi dinamik kompilyatsiya texnologiyasi. Androidda JIT kompilyatori birinchi marta 2.2 Froyo versiyasida Dalvik virtual mashinasi tarkibida paydo bo'ldi va ilovalarning bajarilishini 2–5 marta tezlashtirdi. Google, 2024 ma'lumotlariga ko'ra, ARTdagi zamonaviy JIT interpretatsiyani profillangan hot-metod kompilyatsiyasi bilan birlashtiradi.

Asosiy ma'lumotlar

  • JIT — Just-In-Time kompilyatsiyasi: kodni dastur ishlayotgan vaqtda to'g'ridan-to'g'ri mashina kodiga aylantirish.
  • Dalvikda JIT chaqiruv chegarasidan o'tgandan so'ng (~200 marta) hot-metodlarni kompilyatsiya qilgan.
  • JIT o'rnatish vaqtini qisqartiradi va to'liq AOT kompilyatsiyasidan kamroq joy egallaydi.
  • Asosiy kamchilik — isish kechikishi: dastlabki soniyalarda ilova sekinroq ishlaydi.
  • Zamonaviy ARTda JIT fon AOT optimallashtirishi bilan gibrid rejimda qo'llaniladi.

JIT kompilyatsiyasi nima?

Just-In-Time (JIT) — manba kod yoki bayt-kod oldindan (AOTdagi kabi) emas, balki dasturning tegishli qismining birinchi chaqiruvida mashina ko'rsatmalariga aylantiriladigan kompilyatsiya usuli. “Just-In-Time” atamasi kompilyatsiya “ayni vaqtida” — bajarilishdan to'g'ridan-to'g'ri oldin sodir bo'lishini anglatadi.

JIT kontseptsiyasi 1960-yillardan beri mavjud, ammo keng tarqalishi 1995-yilda Java Virtual Machine paydo bo'lishi bilan sodir bo'ldi. JIT bayt-kodning ko'chma xususiyatini (bir marta yozamiz — hamma joyda ishlatamiz) native kodga yaqin samaradorlik bilan birlashtirishga imkon beradi. Java HotSpot VMda JIT kompilyatori bajarilayotgan kodni tahlil qiladi va vaqt va xotirani tejab, faqat eng muhim qismlarni kompilyatsiya qiladi.

Ishlash prinsipi

JIT kompilyatori kirishda bayt-kodni oladi, uni interpretatsiya qiladi va parallel ravishda statistika to'playdi. Kodning ma'lum bir qismi (metod, sikl) yetarlicha tez-tez chaqirilganda, JIT kompilyatsiya qarorini qabul qiladi. Kompilyatsiya qilingan mashina kodi keshda saqlanadi — takroriy chaqiruvlarda tayyor versiyadan foydalaniladi. Bu butun dasturni kompilyatsiya qilish zaruratisiz tezlashishni ta'minlaydi.

java
// Misol: metod ko'p marta chaqirilgandan so'ng hot bo'ladi
public class HotMethod {
    private int compute(int n) {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += i * i;
        }
        return sum;
    }
}

// Siklda 500 marta chaqirish — JIT compute ni kompilyatsiya qiladi
for (int t = 0; t < 500; t++) {
    hot.compute(1000);
}

Androidda JIT: Dalvik va ART

Androidda JIT kompilyatsiyasi uch evolyutsiya bosqichidan o'tdi. Birinchi bosqich — JITsiz Dalvik (Android 1.0–2.1): DEX bayt-kodining sof interpretatsiyasi. Ikkinchi bosqich — JITli Dalvik (Android 2.2–4.4): ilovalarni 2–5 marta tezlashtirgan JIT kompilyatorining paydo bo'lishi. Uchinchi bosqich — gibrid JITli ART (Android 7.0+): JITning yangi sifatda qaytishi.

Dalvikdagi JIT trace-based kompilyator sifatida amalga oshirilgan. U alohida metodlarni emas, balki ketma-ket tez-tez bajariladigan ko'rsatmalar zanjirlarini (traces) tahlil qilgan. Bu bir nechta metodlarni o'z ichiga olgan butun bajarish yo'llarini kompilyatsiya qilishga imkon bergan. Bunday yondashuv kichik ko'rsatmalar keshi bo'lgan mobil protsessorlar uchun samarali edi, chunki kompilyatsiya qilingan trace L1 keshiga sig'ardi.

Zamonaviy ARTda JIT

Android 7.0 Nougatdan boshlab, ART bajarish profillari asosida alohida metodlarni kompilyatsiya qiluvchi method-based JIT dan foydalanadi. Bu JIT Dalvik JITdan sezilarli darajada tez ishlaydi: bitta metodning odatdagi kompilyatsiya vaqti Dalvikdagi 3–5 ms ga nisbatan 0.5–1 ms ni tashkil qiladi. Kompilyatsiya qilingan kod ilova yig'imidan emas, balki alohida xotira sohasida (JIT code cache) saqlanadi, bu fragmentatsiyani kamaytiradi.

ParametrDalvik JITART JIT
TurTrace-basedMethod-based
Kompilyatsiya tezligi3–5 ms/metod0.5–1 ms/metod
Kompilyatsiya chegarasi~200 chaqiruvDinamik
Kod keshiIlova yig'imidaJIT code cache
ProfillashIchkiTashqi .prof fayllari

Hot-metodlarni aniqlash va kompilyatsiya chegaralari

JITning markaziy mexanizmi — hot-metodlarni aniqlash. Har bir metod chaqiruvi ichki hisoblagichni oshiradi. Hisoblagich chegaradan o'tganda, metod “issiq” deb belgilanadi va kompilyatsiyaga yuboriladi. Dalvikda chegara qat'iy belgilangan edi (~200 chaqiruv). ARTda hisoblagichlar qurilmaning mavjud resurslariga qarab dinamik ravishda sozlanadi.

Kompilyatsiya jarayoni bir necha bosqichni o'z ichiga oladi. Birinchi — bayt-kod tahlili: JIT ko'rsatmalar oqimini o'rganadi va ma'lumotlar oqimi grafigini (data-flow graph) quradi. Ikkinchi — optimallashtirish: kichik metodlarni inline qilish, o'lik kodni olib tashlash, konstantalarni yig'ish. Uchinchi — kod yaratish: optimallashtirilgan grafikni ma'lum CPU arxitekturasi (ARM, ARM64, x86) uchun mashina ko'rsatmalariga aylantirish.

java
// Inlining namoyishi — JIT metod tanasini almashtiradi
public int inlineExample() {
    return square(5);
}

private int square(int x) {
    return x * x;
} // JIT chaqiruvni return 5 * 5; bilan almashtiradi

OSR — On-Stack Replacement

JITning maxsus texnikasi — On-Stack Replacement (OSR). Agar metod yuzlab iteratsiya davom etadigan uzoq siklni o'z ichiga olsa, JIT siklni “uchish paytida” kompilyatsiya qilishi va interpretatsiya qilingan versiyani to'g'ridan-to'g'ri bajarish vaqtida kompilyatsiya qilingan versiya bilan almashtirishi mumkin. OSR ayniqsa hisoblash vazifalari uchun samaralidir: renderlash, tasvirni qayta ishlash, kriptografiya.

JIT vs AOT: qiyosiy tahlil

JIT va AOT — qarama-qarshi kelishuvlarga ega ikki kompilyatsiya yondashuvi. JIT tarqatishning ixchamligi va moslashuvchanligi uchun birinchi ishga tushirish tezligini qurbon qiladi. AOT maksimal samaradorlikni birinchi soniyadan ta'minlash uchun o'rnatish vaqti va disk maydonini qurbon qiladi. Hech bir yondashuv mutlaqo yaxshi emas — tanlov stsenariyga bog'liq.

JITning asosiy afzalligi adaptiv optimallashtirishdir. JIT AOT uchun mavjud bo'lmagan profil ma'lumotlaridan foydalanishi mumkin: ob'ektlarning aniq turlari, haqiqiy chaqiruv chastotasi, haqiqiy tarmoqlanishlar. Bu statik kompilyatsiyada mumkin bo'lmagan agressiv optimallashtirishlarni qo'llashga imkon beradi. Masalan, JIT amalda faqat bitta qabul qiluvchi turi mavjud bo'lsa, metod chaqiruvlarini virtualizatsiya qilishi mumkin (devirtualize).

MezonJITAOT
O'rnatish vaqtiBir zumdaHajmiga bog'liq
Birinchi ishga tushirishSekinroq (isish)Tez
Disk maydoniMinimal+15–30%
MoslashuvchanlikYuqoriPast
CPU iste'moliKompilyatsiyada cho'qqiBarqaror

Qachon JITni tanlash kerak

JIT kompilyatsiyasi joylashtirish tezligi va disk maydonini tejash muhim bo'lganda afzal ko'riladi. Mobil ishlab chiqish kontekstida JIT tez-tez yangilanadigan ilovalar (A/B testlash, hotfix) uchun idealdir. JIT shuningdek kod kuniga o'nlab marta qayta quriladigan ishlab chiqish bosqichida ham qulaydir — kompilyatsiyada tejalgan har bir soniya fikr-mulohaza davrini tezlashtiradi.

JIT kompilyatsiyasining afzalliklari

JIT dasturchilarga bir qator amaliy afzalliklarni taqdim etadi. Birinchisi — kichik APK hajmi. JIT yondashuvida APKga kompilyatsiya qilingan native koddan 20–30% kamroq joy egallaydigan faqat bayt-kod (DEX) joylanadi. Cheklangan ichki xotiraga ega foydalanuvchilar uchun bu muhim afzallikdir.

Ikkinchi afzallik — qurilmaga moslashish. JIT kodni haqiqiy CPU arxitekturasi, RAM miqdori va joriy yukni hisobga olgan holda kompilyatsiya qiladi. Masalan, 2 GB RAMli qurilmada JIT kamroq agressiv kompilyatsiya qilib, xotirani tejashi mumkin, 12 GBli flagmanda esa barcha mumkin bo'lgan optimallashtirishlarni qo'llashi mumkin. AOT kompilyatsiyasi esa aksincha, qarorni o'rnatish vaqtida mustahkamlaydi.

Platforma mustaqilligi

Bayt-kod platformadan mustaqil bo'lib qoladi, bu ilovalarni tarqatishni soddalashtiradi. Bitta APK ARM, ARM64 va x86 qurilmalarida ishlaydi, JIT esa har bir arxitektura uchun native kod yaratilishini ta'minlaydi. AOT yondashuvi uchun APKga native kodning bir nechta variantini kiritish (hajmni oshirish) yoki har bir arxitektura uchun alohida versiyani kompilyatsiya qilish kerak bo'ladi.

JITning kamchiliklari va cheklovlari

JITning asosiy kamchiligi isish kechikishidir (warm-up delay). Foydalanuvchi JIT hot-metodlarni kompilyatsiya qilayotganda ilovaning dastlabki soniyalarida sekinlashishlarni ko'radi. O'yinlarda bu dastlabki darajalarda “qoqish” (stuttering) sifatida namoyon bo'ladi. Animatsiyali ilovalarda — ekranlar orasidagi birinchi o'tishlarda titrashlar.

Ikkinchi kamchilik energiya iste'molidir. Kompilyatsiya jarayoni CPU ni intensiv yuklab, isish davrida energiya iste'molini 10–20% oshiradi. Batareya bilan ishlaydigan qurilmalarda bu avtonom ish vaqtini qisqartiradi. Ayniqsa ilovalarni tez-tez qayta ishga tushirish stsenariylarida seziladi (cheklangan xotira bilan ko'p vazifalilik, tizim jarayonlarni tushiradi va qayta yuklaydi).

Kesh fragmentatsiyasi

Yana bir muammo JIT keshining fragmentatsiyasidir. Kompilyatsiya qilingan kod uzluksiz xotira sohasida saqlanadi. Yangi sinflar yuklanganda va qo'shimcha metodlar kompilyatsiya qilinganda, kesh fragmentatsiyaga uchraydi, bu xotira boshqaruvi ustidan qo'shimcha yukni oshiradi. Dalvikda bu muammo keshi davriy tozalash bilan hal qilingan; ARTda JIT keshi yig'imdan alohida ajratiladi va o'z defragmentatsiya strategiyasidan foydalanadi.

Gibrid rejim: ikki dunyoning eng yaxshisi

ARTdagi zamonaviy yondashuv — gibrid kompilyatsiya, JIT va AOTning kuchli tomonlarini birlashtiradi. Ilova o'rnatilayotganda kompilyatsiya bajarilmaydi — faqat bayt-kodni tekshirish (verify). Bu tez o'rnatish va minimal joy egallashni ta'minlaydi. Birinchi ishga tushirishlar hot-metodlarning JIT kompilyatsiyasi bilan interpretatsiya rejimida ishlaydi — foydalanuvchi uzoq kutishsiz maqbul samaradorlikka ega bo'ladi.

Parallel ravishda haqiqiy foydalanish haqida ma'lumot to'playdigan fon profilatori ishlaydi. Ilovaning 2–3 to'liq ishga tushirilishidan so'ng profil yetarlicha to'liqlikka erishadi va tizim hot-metodlarni native kodga kompilyatsiya qilish uchun dex2oatni ishga tushiradi. Bu operatsiya qurilma yuklanmagan paytda (zaryadlash, ekran o'chirilgan) fonda bajariladi. Fon AOT tugagandan so'ng ilova to'liq AOT kompilyatsiyasi bilan solishtirish mumkin bo'lgan samaradorlikka erishadi.

bash
# Fon kompilyatsiyasining majburiy ishga tushirilishi
adb shell cmd package compile -m speed-profile -f com.example.app

# Kompilyatsiya holatini ko'rish
adb shell cmd package dump-profiles com.example.app

Gibrid yondashuv natijalari

Google I/O 2017 ma'lumotlariga ko'ra, gibrid kompilyatsiya sof AOTga nisbatan ilovalarni o'rnatish vaqtini 30–50% qisqartirdi. Tizim bo'limida egallangan joy 20–30% kamaydi. Fon kompilyatsiyasidan keyin samaradorlik to'liq AOT darajasiga mos keladi. Gibrid AOTdan orqada qoladigan yagona stsenariy — o'rnatishdan so'ng darhol birinchi ishga tushirish: ilova JIT rejimida ishlaydi va 10–15% sekinroq bo'lishi mumkin.

Tez-tez beriladigan savollar

JIT kompilyatsiyasi oddiy so'zlar bilan nima?

JIT — dasturni tezlashtirish usuli bo'lib, unda kod oldindan emas, balki ish paytida qismlarga bo'lib mashina tiliga tarjima qilinadi. Eng tez-tez ishlatiladigan qismlar kompilyatsiya qilinadi va keshlanadi, kam uchraydigan qismlar esa asl ko'rinishida qoladi.

JIT AOTdan qanday farq qiladi?

JIT kodni bajarish vaqtida kompilyatsiya qiladi, bu joyni tejaydi va o'rnatishni tezlashtiradi. AOT butun kodni oldindan kompilyatsiya qiladi — ilova tezroq ishga tushadi, lekin diskda ko'proq joy va o'rnatish uchun ko'proq vaqt talab qiladi.

Nega JIT Androiddan olib tashlandi?

JIT olib tashlanmadi, balki evolyutsiya qildi. Android 5.0 da JITli Dalvik sof AOT bilan ART bilan almashtirildi. Android 7.0 da JIT ARTga gibrid tizimning bir qismi sifatida qaytdi, u yerda optimal samaradorlik uchun fon AOT kompilyatsiyasi bilan birgalikda ishlaydi.

JIT energiya iste'moliga qanday ta'sir qiladi?

JIT CPU yuki tufayli isish davrida energiya iste'molini 10–20% oshiradi. Hot-metodlar kompilyatsiyasi tugagandan so'ng energiya iste'moli normal darajaga qaytadi. ART gibrid rejimi fon kompilyatsiyasi orqali bu cho'qqilarni minimallashtiradi.

Foydalanuvchi JIT isishini ko'radimi?

Ha, intensiv hisoblash stsenariylarida. Foydalanuvchi ilovaning dastlabki soniyalarida yoki o'yin boshida sekinlashishlarni payqashi mumkin. Androidning zamonaviy versiyalarida (8.0+) gibrid rejim profillangan kompilyatsiya orqali bu effektni minimal darajaga tushiradi.

Xulosa

  • JIT (Just-In-Time) — bayt-kodni bajarish vaqtida mashina ko'rsatmalariga aylantiruvchi dinamik kompilyatsiya.
  • Androidda JIT evolyutsiyadan o'tdi: Dalvikda trace-based → to'liq AOT → zamonaviy ARTda JIT+AOT gibridi.
  • Hot-metodlar chaqiruv hisoblagichlari orqali aniqlanadi va chegaradan o'tganda (~200 chaqiruv) kompilyatsiya qilinadi.
  • OSR (On-Stack Replacement) bajarilishni to'xtatmasdan uzoq sikllarni uchish paytida kompilyatsiya qilishga imkon beradi.
  • JITning asosiy afzalliklari: kichik APK hajmi, tez o'rnatish va qurilmaga moslashish.
  • Asosiy kamchiliklari: isish kechikishi, cho'qqi energiya iste'moli va kesh fragmentatsiyasi.
  • ART gibrid rejimi (Android 7.0+) yuqori samaradorlikni saqlagan holda o'rnatish vaqtini 30–50% qisqartiradi.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing