ART Tam Zamanında (JIT) Derleyicisini Uygulama

Android çalışma zamanı (ART), Android uygulamalarının çalışırken performansını sürekli olarak iyileştiren kod profili oluşturma özelliğine sahip tam zamanında (JIT) bir derleyici içerir. JIT derleyicisi, ART'nin mevcut zaman öncesi (AOT) derleyicisini tamamlar ve çalışma zamanı performansını iyileştirir, depolama alanından tasarruf sağlar ve uygulama ve sistem güncellemelerini hızlandırır. Ayrıca, otomatik uygulama güncellemeleri sırasında sistem yavaşlamasını veya kablosuz (OTA) güncellemeleri sırasında uygulamaların yeniden derlenmesini önleyerek AOT derleyicisini geliştirir.

JIT ve AOT, benzer bir optimizasyon kümesiyle aynı derleyiciyi kullanmasına rağmen, oluşturulan kod aynı olmayabilir. JIT, çalışma zamanı türü bilgisini kullanır, daha iyi satır içi yapabilir ve tümü biraz farklı kod üreten yığın değiştirme (OSR) derlemesini mümkün kılar.

JIT mimarisi

JIT mimarisi
Şekil 1. JIT mimarisi.

JIT derlemesi

JIT derlemesi aşağıdaki faaliyetleri içerir:

Profil kılavuzlu kompozisyon
Şekil 2. Profil yönlendirmeli derleme.
  1. Kullanıcı uygulamayı çalıştırır ve ardından .dex dosyasını yüklemesi için tetikler.
    • .oat dosyası ( .dex dosyası için AOT ikili dosyası) mevcutsa, ART bunu doğrudan kullanır. .oat dosyaları düzenli olarak oluşturulsa da, her zaman derlenmiş kod (AOT ikili dosyası) içermezler.
    • .oat dosyası derlenmiş kod içermiyorsa, ART, .dex dosyasını yürütmek için JIT ve yorumlayıcı aracılığıyla çalışır.
  2. JIT, speed derleme filtresine göre derlenmemiş herhangi bir uygulama için etkinleştirilir ("uygulamadan olabildiğince fazla derleyin" der).
  3. JIT profil verileri, yalnızca uygulamanın erişebileceği bir sistem dizinindeki bir dosyaya atılır.
  4. AOT derlemesi ( dex2oat ) arka plan programı, derlemesini yürütmek için bu dosyayı ayrıştırır.

    JIT arka plan programı
    Şekil 3. JIT arka plan programı etkinlikleri.

Google Play hizmeti, paylaşılan kitaplıklara benzer şekilde davranan diğer uygulamalar tarafından kullanılan bir örnektir.

JIT iş akışı

JIT mimarisi
Şekil 4. JIT veri akışı.
  • Profil oluşturma bilgileri, kod önbelleğinde saklanır ve bellek baskısı altında çöp toplama işlemine tabi tutulur.
    • Uygulama arka plandayken alınan bir anlık görüntünün tüm verileri (yani, JIT'lenen her şeyi) içereceğinin garantisi yoktur.
    • Her şeyin kaydedildiğinden emin olmak için herhangi bir girişimde bulunulmaz (çünkü bu, çalışma zamanı performansını etkileyebilir).
  • Yöntemler üç farklı durumda olabilir:
    • yorumlanmış (dex kodu)
    • JIT derlendi
    • AOT derlendi
    Hem JIT hem de AOT kodu mevcutsa (örneğin, tekrarlanan de-optimizasyonlardan dolayı), JIT'li kod tercih edilir.
  • JIT'i ön plan uygulama performansını etkilemeden çalıştırmak için gereken bellek gereksinimi, söz konusu uygulamaya bağlıdır. Büyük uygulamalar, küçük uygulamalardan daha fazla bellek gerektirir. Genel olarak, büyük uygulamalar 4 MB civarında sabitlenir.

JIT günlüğünü açma

JIT günlüğünü açmak için aşağıdaki komutları çalıştırın:

adb root
adb shell stop
adb shell setprop dalvik.vm.extra-opts -verbose:jit
adb shell start

JIT'i devre dışı bırakma

JIT'i devre dışı bırakmak için aşağıdaki komutları çalıştırın:

adb root
adb shell stop
adb shell setprop dalvik.vm.usejit false
adb shell start

derleme zorlama

Derlemeyi zorlamak için aşağıdakileri çalıştırın:

adb shell cmd package compile

Belirli bir paketi derlemeye zorlamak için yaygın kullanım örnekleri:

  • Profil tabanlı:
    adb shell cmd package compile -m speed-profile -f my-package
    
  • Tam:
    adb shell cmd package compile -m speed -f my-package
    

Tüm paketleri derlemeye zorlamak için yaygın kullanım durumları:

  • Profil tabanlı:
    adb shell cmd package compile -m speed-profile -f -a
    
  • Tam:
    adb shell cmd package compile -m speed -f -a
    

Profil verilerini temizleme

Profil verilerini temizlemek ve derlenmiş kodu kaldırmak için aşağıdakileri çalıştırın:

  • Bir paket için:
    adb shell cmd package compile --reset my-package
    
  • Tüm paketler için:
    adb shell cmd package compile --reset -a