JIT: Just-In-Time derlemesi nedir ve nasıl çalışır

Yazar: IT Sectr Yayınlanma: 2026-04-16 Okuma süresi: 9 dk

JIT (Just-In-Time), bayt kodunu veya programın ara temsilini yürütme sırasında doğrudan makine talimatlarına dönüştüren dinamik bir derleme teknolojisidir. Android'de, JIT derleyicisi ilk olarak 2.2 Froyo sürümünde Dalvik sanal makinesinin bir parçası olarak ortaya çıktı ve uygulama yürütmeyi 2–5 kat hızlandırdı. Google, 2024'e göre, ART'deki modern JIT, yorumlamayı sıcak yöntemlerin profilli derlemesiyle birleştirir.

Anahtar Noktalar

  • JIT — Just-In-Time derlemesi: program çalışırken kodu doğrudan makine koduna dönüştürme.
  • Dalvik'te, JIT çağrı eşiğini (~200 kez) aştıktan sonra sıcak yöntemleri derlerdi.
  • JIT, kurulum süresini azaltır ve tam AOT derlemesinden daha az yer kaplar.
  • Ana dezavantaj ısınma gecikmesidir: ilk saniyelerde uygulama daha yavaş çalışır.
  • Modern ART'de, JIT arka planda AOT optimizasyonu ile hibrit modda kullanılır.

JIT Derlemesi Nedir?

Just-In-Time (JIT), kaynak kodun veya bayt kodunun önceden (AOT'de olduğu gibi) değil, programın ilgili bölümünün ilk çağrıldığı anda makine talimatlarına dönüştürüldüğü bir derleme yöntemidir. “Just-In-Time” terimi, derlemenin yürütmeden hemen önce “tam zamanında” gerçekleştiği anlamına gelir.

JIT kavramı 1960'lardan beri var olmasına rağmen, 1995'te Java Sanal Makinesi'nin ortaya çıkmasıyla geniş çapta benimsenmiştir. JIT, bayt kodunun taşınabilirliğini (bir kez yaz — her yerde çalıştır) yerel koda yakın performansla birleştirmeyi sağlar. Java HotSpot VM'de, JIT derleyicisi yürütülen kodu analiz eder ve yalnızca en kritik bölümleri derleyerek zaman ve bellek tasarrufu sağlar.

Nasıl Çalışır

JIT derleyicisi girdi olarak bayt kodunu alır, onu yorumlar ve aynı anda istatistik toplar. Kodun belirli bir bölümü (yöntem, döngü) yeterince sık çağrıldığında, JIT onu derlemeye karar verir. Derlenmiş makine kodu önbellekte saklanır — sonraki çağrılarda zaten derlenmiş sürüm kullanılır. Bu, tüm programı derlemek zorunda kalmadan hızlanma sağlar.

java
// Örnek: birden çok çağrıdan sonra bir yöntem sıcak hale gelir
public class HotMethod {
    private int compute(int n) {
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += i * i;
        }
        return sum;
    }
}

// Döngüde 500 kez çağrı — JIT, compute'ı derleyecek
for (int t = 0; t < 500; t++) {
    hot.compute(1000);
}

Android'de JIT: Dalvik ve ART

Android'de, JIT derlemesi üç evrim aşamasından geçti. İlk aşama — JIT'siz Dalvik (Android 1.0–2.1): DEX bayt kodunun saf yorumlanması. İkinci aşama — JIT'li Dalvik (Android 2.2–4.4): uygulamaları 2–5 kat hızlandıran JIT derleyicisinin tanıtılması. Üçüncü aşama — Hibrit JIT'li ART (Android 7.0+): JIT'in yeni bir kapasitede geri dönüşü.

Dalvik'teki JIT, iz tabanlı bir derleyici olarak uygulanmıştır. Tek tek yöntemleri değil, sık sık sırayla yürütülen talimat zincirlerini (izleri) analiz ederdi. Bu, birden çok yöntem dahil olmak üzere tüm yürütme yollarını derlemeye izin verirdi. Bu yaklaşım, derlenmiş iz L1 önbelleğine sığdığı için küçük talimat önbelleklerine sahip mobil işlemciler için etkiliydi.

Modern ART'de JIT

Android 7.0 Nougat'tan itibaren ART, yöntem tabanlı JIT kullanır — yürütme profillerine dayalı olarak tek tek yöntemleri derler. Bu JIT, Dalvik JIT'ten önemli ölçüde daha hızlı çalışır: bir yöntem için tipik derleme süresi Dalvik'te 3–5 ms'ye kıyasla 0.5–1 ms'dir. Derlenmiş kod, uygulama yığını yerine ayrı bir bellek alanında (JIT kod önbelleği) saklanır ve bu da parçalanmayı azaltır.

ParametreDalvik JITART JIT
Türİz tabanlıYöntem tabanlı
Derleme Hızı3–5 ms/yöntem0.5–1 ms/yöntem
Derleme Eşiği~200 çağrıDinamik
Kod ÖnbelleğiUygulama yığınındaJIT kod önbelleği
Profil OluşturmaDahiliHarici .prof dosyaları

Sıcak Yöntem Tespiti ve Derleme Eşikleri

JIT'in merkezi mekanizması sıcak yöntem tespitidir. Her yöntem çağrısı dahili bir sayacı artırır. Sayaç eşiği geçtiğinde, yöntem “sıcak” olarak işaretlenir ve derlemeye gönderilir. Dalvik'te eşik sabitti (~200 çağrı). ART'de sayaçlar, cihazın mevcut kaynaklarına bağlı olarak dinamik olarak yapılandırılır.

Derleme süreci birkaç aşama içerir. Birincisi — bayt kodu analizi: JIT, talimat akışını inceler ve bir veri akışı grafiği oluşturur. İkincisi — optimizasyon: küçük yöntemlerin satır içine alınması, ölü kodun kaldırılması, sabit katlama. Üçüncüsü — kod oluşturma: optimize edilmiş grafiğin belirli bir CPU mimarisi (ARM, ARM64, x86) için makine talimatlarına dönüştürülmesi.

java
// Satır içine alma gösterimi — JIT, yöntem gövdesini satır içine alacak
public int inlineExample() {
    return square(5);
}

private int square(int x) {
    return x * x;
} // JIT, çağrıyı return 5 * 5; ile değiştirecek

OSR — Yığın Üzerinde Değiştirme (On-Stack Replacement)

JIT'in özel bir tekniği — Yığın Üzerinde Değiştirme (OSR). Bir yöntem, yüzlerce yineleme boyunca bitmeyen uzun bir döngü içeriyorsa, JIT döngüyü “anında” derleyebilir ve yorumlanan sürümü yürütme sırasında derlenmiş sürümle değiştirebilir. OSR, özellikle hesaplama görevleri için etkilidir: işleme, görüntü işleme, kriptografi.

JIT vs AOT: Karşılaştırmalı Analiz

JIT ve AOT, zıt ödünleşimlere sahip iki derleme yaklaşımıdır. JIT, kompakt dağıtım boyutu ve uyarlanabilirlik için ilk başlatma hızından ödün verir. AOT, ilk saniyeden itibaren maksimum performans için kurulum süresinden ve disk alanından ödün verir. Hiçbir yaklaşım kesinlikle daha iyi değildir — seçim senaryoya bağlıdır.

JIT'in temel avantajı uyarlanabilir optimizasyondur. JIT, AOT için mevcut olmayan profil bilgilerini kullanabilir: kesin nesne türleri, gerçek çağrı sıklığı, gerçek dallanma desenleri. Bu, statik derleme ile imkansız olan agresif optimizasyonları uygulamaya izin verir. Örneğin, pratikte yalnızca bir alıcı türüyle karşılaşılırsa JIT, yöntem çağrılarının sanallaştırmasını kaldırabilir.

KriterJITAOT
Kurulum SüresiAnındaBoyuta bağlı
İlk BaşlatmaDaha yavaş (ısınma)Hızlı
Disk AlanıMinimum+15–30%
UyarlanabilirlikYüksekDüşük
CPU KullanımıDerleme sırasında ani yükselişKararlı

JIT Ne Zaman Seçilmeli

JIT derlemesi, hızlı dağıtım ve disk alanı tasarrufu önemli olduğunda tercih edilir. Mobil geliştirme bağlamında, JIT sık sık güncellenen uygulamalar (A/B testi, sıcak düzeltmeler) için idealdir. JIT, kodun günde düzinelerce kez yeniden oluşturulduğu geliştirme sırasında da kullanışlıdır — derlemede tasarruf edilen her saniye geri bildirim döngüsünü hızlandırır.

JIT Derlemesinin Avantajları

JIT, geliştiricilere bir dizi pratik avantaj sağlar. Birincisi — küçük APK boyutu. JIT yaklaşımıyla, APK'ya yalnızca bayt kodu (DEX) paketlenir ve derlenmiş yerel koddan %20–30 daha az yer kaplar. Sınırlı dahili depolama alanına sahip kullanıcılar için bu önemli bir avantajdır.

İkinci avantaj cihaz uyarlamasıdır. JIT, gerçek CPU mimarisini, RAM miktarını ve mevcut yükü dikkate alarak kod derler. Örneğin, 2 GB RAM'li bir cihazda JIT, bellekten tasarruf etmek için daha az agresif derleme yapabilirken, 12 GB'lık bir amiral gemisinde tüm olası optimizasyonları uygulayabilir. AOT derlemesi ise kararı kurulum anında sabitler.

Platform Bağımsızlığı

Bayt kodu platformdan bağımsız kalır ve uygulama dağıtımını basitleştirir. Tek bir APK, ARM, ARM64 ve x86 cihazlarında çalışır ve JIT her mimari için yerel kod oluşturur. AOT yaklaşımı, APK'ya birden çok yerel kod varyantı eklemeyi (boyutu artırarak) veya her mimari için ayrı bir sürüm derlemeyi gerektirir.

JIT'in Dezavantajları ve Sınırlamaları

JIT'in ana dezavantajı ısınma gecikmesidir. Kullanıcı, JIT sıcak yöntemleri derlerken uygulamanın ilk saniyelerinde yavaşlama yaşar. Oyunlarda bu, ilk seviyelerde takılma olarak kendini gösterir. Animasyonlu uygulamalarda — ekranlar arasındaki ilk geçişlerde sıçramalar.

İkinci dezavantaj — güç tüketimi. Derleme süreci CPU'yu yoğun şekilde yükler ve ısınma döneminde güç tüketimini %10–20 artırır. Pil ile çalışan cihazlarda bu, pil ömrünü kısaltır. Özellikle sık uygulama yeniden başlatmalarının olduğu senaryolarda (sistemin işlemleri boşalttığı ve yeniden yüklediği sınırlı bellekle çoklu görev) belirgindir.

Önbellek Parçalanması

Başka bir sorun — JIT önbellek parçalanması. Derlenmiş kod sürekli bir bellek alanında saklanır. Yeni sınıflar yüklendiğinde ve ek yöntemler derlendiğinde, önbellek parçalanır ve bellek yönetimi yükü artar. Dalvik'te bu sorun periyodik önbellek temizliğiyle çözülürdü; ART'de JIT önbelleği yığından ayrı olarak tahsis edilir ve kendi birleştirme stratejisini kullanır.

Hibrit Mod: İki Dünyanın En İyisi

ART'deki modern yaklaşım — hibrit derleme, JIT ve AOT'nin güçlü yönlerini birleştirir. Uygulama kurulumu sırasında herhangi bir derleme yapılmaz — yalnızca bayt kodu doğrulaması (verify) yapılır. Bu, hızlı kurulum ve minimum alan kullanımı sağlar. İlk başlatmalar, sıcak yöntemlerin JIT derlemesiyle yorumlama modunda çalışır — kullanıcı uzun bekleme süreleri olmadan kabul edilebilir performans elde eder.

Paralel olarak, bir arka plan profil oluşturucu gerçek kullanım hakkında veri toplar. 2–3 tam uygulama başlatmasından sonra profil yeterli bütünlüğe ulaşır ve sistem, sıcak yöntemleri yerel koda derlemek için dex2oat'ı çalıştırır. Bu işlem, cihaz yüklü olmadığında (şarj olurken, ekran kapalıyken) arka planda gerçekleştirilir. Arka plan AOT tamamlandıktan sonra uygulama, tam AOT derlemesine eşdeğer performansa ulaşır.

bash
# Arka plan derlemesinin zorunlu başlatılması
adb shell cmd package compile -m speed-profile -f com.example.app

# Derleme durumunu görüntüle
adb shell cmd package dump-profiles com.example.app

Hibrit Yaklaşımın Sonuçları

Google I/O 2017'ye göre, hibrit derleme, saf AOT'ye kıyasla uygulama kurulum süresini %30–50 oranında azaltmıştır. Sistem bölümünde kaplanan disk alanı %20–30 azalmıştır. Aynı zamanda, arka plan derlemesinden sonraki performans tam AOT seviyesine karşılık gelir. Hibritin AOT'den geride kaldığı tek senaryo, kurulumdan hemen sonraki ilk başlatmadır: uygulama JIT modunda çalışır ve %10–15 daha yavaş olabilir.

Sıkça Sorulan Sorular

Basit terimlerle JIT derlemesi nedir?

JIT, kodun önceden değil, çalışma sırasında parçalar halinde makine diline çevrildiği bir program hızlandırma yoludur. En sık kullanılan bölümler derlenir ve önbelleğe alınırken, nadir olanlar orijinal hallerinde kalır.

JIT, AOT'den nasıl farklıdır?

JIT, yürütme sırasında kod derleyerek alan tasarrufu sağlar ve kurulumu hızlandırır. AOT, tüm kodu önceden derler — uygulama daha hızlı başlar ancak daha fazla disk alanı ve kurulum süresi gerektirir.

JIT neden Android'den kaldırıldı?

JIT kaldırılmadı — evrimleşti. Android 5.0'te, JIT'li Dalvik'in yerini saf AOT'li ART aldı. Android 7.0'da JIT, optimum performans için arka plan AOT derlemesiyle birlikte çalıştığı hibrit bir sistemin parçası olarak ART'ye geri döndü.

JIT güç tüketimini nasıl etkiler?

JIT, CPU yükü nedeniyle ısınma döneminde güç tüketimini %10–20 artırır. Sıcak yöntem derlemesi tamamlandıktan sonra güç tüketimi normal seviyelere döner. ART'nin hibrit modu, arka plan derlemesi yoluyla bu ani yükselişleri en aza indirir.

JIT ısınması kullanıcı tarafından görülebilir mi?

Evet, yoğun hesaplama senaryolarında. Kullanıcı, uygulamanın ilk saniyelerinde veya bir oyunun başında yavaşlama fark edebilir. Modern Android sürümlerinde (8.0+), hibrit mod, profilli derleme sayesinde bu etkiyi en aza indirir.

Özet

  • JIT (Just-In-Time), yürütme sırasında bayt kodunu makine talimatlarına dönüştüren dinamik bir derlemedir.
  • Android'de JIT evrimleşti: Dalvik'te iz tabanlı → tam AOT → modern ART'de hibrit JIT+AOT.
  • Sıcak yöntemler, çağrı sayaçları aracılığıyla tespit edilir ve eşik (~200 çağrı) aşıldığında derlenir.
  • OSR (Yığın Üzerinde Değiştirme), yürütmeyi kesintiye uğratmadan uzun döngüleri anında derlemeye izin verir.
  • JIT'in ana avantajları: küçük APK boyutu, hızlı kurulum ve cihaz uyarlaması.
  • Ana dezavantajlar: ısınma gecikmesi, zirve güç tüketimi ve önbellek parçalanması.
  • ART hibrit modu (Android 7.0+), yüksek performansı korurken kurulum süresini %30–50 azaltır.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun