JIT Compiler, JRE dediğimiz Java Runtime Environment'ın bir bileşenidir, misyonu java uygulamalarının performansını runtime seviyesinde artırmaktır.
Normalde bildiğimiz gibi bir java kaynak kodu compile edildiğinde oluşan class dosyası byte koddan ibarettir, runtime esnasında doğrudan bu byte kodlar jvm tarafından interpret edilir(class dosyasının yüklenmesi, byte kodların anlamlandırılması ve gereğinin yapılması). Bu da runtime esnasında ekstradan bir cpu ve memory tüketimi anlamına gelir, dolayısıyla java uygulamaları native uygulamalara göre bir performans dezavantajına sahiptir. İşte bu dezavantajı minimuma indirmek için JIT Compiler dediğimiz bileşen devreye giriyor.
JIT Compiler bir metod çalıştırılacağı zaman bunu her defasında ilgili class dosyasından interpret etmek yerine, metodun byte kodlarını runtime esnasında bir kere compile ederek native makine diline çevirir ve sonraki metod çağrıları bu optimize edilerek compile edilmiş native kod üzerinden gerçekleşir. Runtime esnasında kod çalıştıkça elde edilen istatistikler optimizasyona ışık tutar.
Runtime esnasında compile işlemi gerçekleştirmek tabi ki maliyetsiz bir işlem değildir, bu nedenle bir metod daha ilk çağrıldığında JIT compiler tarafından compile edilir demek doğru değil. Burada bir optimizasyon söz konusu, metodun çağrılma sayısı jvm seviyesinde tutulur ve bu sayı belli bir değerin üzerine çıktığında compile işlemi gerçekleşir. Sonraki metod çağrılarında artık compile edilmiş kod kullanılır. Bu arada metodun çağrılma sayısı sıfırlanır ve tekrar sayılmaya başlanır, sayı yeniden threshold değerine ulaştığı zaman tekrar compile işlemi gerçekleştirilir. Önceki compile işlemine göre daha fazla optimizasyon seçeneği kullanılır. JIT Compiler tarafından gerçekleştirilen bu yeniden compile etme işlemi maksimum optimizasyon seviyesi yakalanana kadar sürdürülür.
Optimizasyon örneği;
Optimizasyon öncesi kod
class A {
B b;
public void newMethod() {
y = b.get();
...do stuff...
z = b.get();
sum = y + z;
}
}
class B {
int value;
final int get() {
return value;
}
}
Optimizasyon sonrası kod
class A {
B b;
public void newMethod() {
y = b.value;
...do stuff...
sum = y + y;
}
}
class B {
int value;
final int get() {
return value;
}
}
JIT Compiler'ın -Djava.compiler=NONE veya java -Xint opsiyonu ile devre dışı bırakılması mümkündür, ama önerilmez.