JIT derleme: program çalışırken makine koduna çevirme
JIT derleyici, programın sık çalışan kısımlarını çalışma sırasında makine koduna çevirerek hızlandırır. Nasıl çalıştığını ve AOT farkını öğrenin.
JIT derleyici nedir?
JIT (Just-In-Time, tam zamanında derleme), bir programın ara kodunun veya kaynak kodunun çalışma sırasında, yani ihtiyaç duyulduğu anda makine koduna çevrilmesi tekniğidir. Java'da JVM, bytecode'u önce yorumlayarak yürütür, sık çalışan bölümleri ise JIT derleyiciyle hedef işlemcinin kendi diline çevirip sonraki çağrılarda bu hızlı sürümü kullanır.
Bu yaklaşım farklı yaklaşımların iyi yanlarını birleştirmeyi hedefler: yorumlayıcının hızlı başlaması ve taşınabilirliği ile derlenmiş kodun yüksek çalışma hızı.
Nasıl çalışır?
Çalışma düzeni profil tabanlıdır. JVM program başlarken kodu yorumlar ve bu sırada hangi yöntemlerin ve döngülerin sık çalıştığını sayaçlarla izler. Belli bir sıklık eşiğini aşan bölümler sıcak nokta (hot spot) olarak değerlendirilir ve derleyiciye gönderilir. Derleyici bu bölümü makine koduna çevirir ve sonuç bellekte bir kod önbelleğinde saklanır.
Optimizasyonlar sırasında yalnızca çeviri yapılmaz. Derleyici çalışma anında toplanan gözleme dayanarak kısa yöntemleri çağrı yerine yerleştirebilir (inlining), kullanılmayan kod yollarını eleyebilir ve döngüleri yeniden düzenleyebilir. Varsayım sonradan geçersiz olursa, JVM kodu eski haline geri alıp yeniden değerlendirebilir.
Küçük bir örnek
Örneğin bir sunucu uygulaması her istekte aynı doğrulama yöntemini çağırıyor. Uygulama yeni başlatıldığında bu yöntem yorumlanarak çalışır ve görece yavaştır. İstek sayısı arttıkça yöntem sıcak nokta olarak işaretlenir, derlenir ve bundan sonraki çağrılar makine koduyla yürütülür. Aynı yöntemin ilk yanıt süresi ile ısındıktan sonraki yanıt süresi arasında fark görülmesi bu yüzdendir.
Bu davranış pratikte ısınma (warm-up) olarak anılır. Performans testlerinin ısınma dönemi atılmadan yorumlanması çoğu zaman yanıltıcıdır.
JIT ile AOT derlemenin farkı
AOT (Ahead-Of-Time) derlemede program çalışmadan önce, geliştirme ya da paketleme aşamasında makine koduna çevrilir. Başlangıç süresi kısadır ve çalışma anında derleme yükü olmaz; ancak program hakkında çalışma sırasında toplanan gözleme dayalı optimizasyonlar sınırlıdır. JIT ise başlangıçta daha fazla kaynak harcar, buna karşılık gerçek kullanım örüntüsüne göre optimize edebilir.
Seçim uygulamanın türüne bağlıdır. Uzun süre çalışan sunucu servislerinde JIT'in sağladığı çalışma anı optimizasyonu değerlidir. Kısa süreli komut satırı araçlarında ya da hızlı ölçeklenen ortamlarda ise başlangıç süresi öne çıktığı için AOT yaklaşımları tercih edilebilir. Java ekosisteminde bu seçeneklerin hepsi bulunur.
Performans ayarında JIT
JIT davranışı performans analizinde izlenen konulardan biridir. Derleme günlükleri hangi yöntemlerin derlendiğini, sıcak noktaların nerede toplandığını ve geri alınan optimizasyonları gösterir. Aşırı büyük yöntemlerin derlenmemesi, kod önbelleğinin dolması ya da sürekli geri alınan optimizasyonlar gibi durumlar tespit edilirse, kod yapısı sadeleştirilerek veya sanal makine ayarlarıyla sorun giderilebilir.
Çoğu uygulamada JIT ayarına elle müdahale gerekmez. Yine de profilleme ile ölçülmüş bir sorun yoksa varsayılanları değiştirmek genellikle kazanç sağlamaz.
Mindset programlarında nerede çalışılır?
Mindset kataloğundaki Java İleri Seviye: JVM Performans ve Bellek Yönetimi eğitiminde JIT derleme ve kod optimizasyonu ayrı bir modül olarak yer alır; profilleme ve gözlemlenebilirlik modülüyle birlikte, üretimdeki Java servislerinin neden ısındıktan sonra hızlandığını ya da neden beklenenden yavaş çalıştığını anlamak isteyen geliştiriciler için uygundur. Spring Boot ve Spring Cloud eğitimleri ise bu çalışma ortamı üzerinde uygulama geliştirme becerisini kazandırır.
İlgili Mindset programı
Java İleri Seviye: JVM Performans ve Bellek Yönetimi
Sık sorulan sorular
JIT derleyici programı yavaşlatır mı?
Başlangıçta derleme işi için ek işlemci zamanı harcar ve bu yüzden ilk yanıtlar yavaş olabilir. Sıcak noktalar derlendikten sonra program genellikle hızlanır. Uzun süre çalışan servislerde bu başlangıç maliyeti, sonraki kazançla dengelenir.
Yorumlayıcı ile JIT derleyici aynı şey midir?
Aynı değildir. Yorumlayıcı komutları tek tek okuyup yürütür ve her çağrıda aynı işi tekrarlar. JIT derleyici ise sık çalışan kodu makine koduna çevirip saklar. Modern sanal makineler ikisini birlikte kullanarak başlangıç hızı ile kalıcı performansı dengeler.
Yalnızca Java mı JIT kullanır?
Hayır. JavaScript motorları, .NET çalışma ortamı ve birçok başka dil çalışma zamanı JIT derleme kullanır. Ayrıntılı uygulama her ortamda farklıdır; ancak sıcak kodu çalışma anında makine koduna çevirme fikri ortaktır.
JIT davranışı nasıl gözlemlenir?
Sanal makine tanılama seçenekleri derleme olaylarını günlüğe yazabilir; profilleme araçları ise sıcak noktaları ve derleme süresini gösterebilir. Kesin seçenek adları kullanılan JVM dağıtımına göre değiştiği için sürümün belgesine bakmak gerekir.