JVM, JDK,JRE, GraalVM ve Quarkus Nedir?

Hasan Kadir Demircan
5 min readFeb 1, 2020

JVM

Java Sanal Makinesi (JVM), java kodunu veya uygulamalarını çalıştırmak için çalışma ortamı sağlayan bir katmandır. JVM her platform için ayrı yüklenmelidir.(Mac, Linux, Windows)

Javada bilinen “Write once, Run everywhere” özelliği JVM ile sağlanmaktadır. Çünkü derlenen kod JVM isimli bir sanal makine üzerinde çalışacaktır.

JVM derlenmiş, platformdan bağımsız bayt kodunuzu alır ve platforma özgü makine kodunu çalıştıracak şekilde yorumlar. Derlenen koddan kastımız JVM bizim yazdığımız .java uzantılı kodları anlamamaktadır burada javac (java compiler) ile .class uzantılı bytecode’lara çevrilmektedir.

JVM

Burada kısaca derleyicilerden de bahsetmek istiyorum.

JIT(Just in Time) Compilers

JVM bünyesinde de bytekodun makine koduna dönüştürüldüğü bir derleme gerçekleştirilir . Bu işleme Just in time (JIT) compilation ismi verilmektedir.

JIT devreye girmeden önce kod bytekod olarak interpreted modda yorumlanır. Elde edilen istatiksel verilere göre en çok çağrılan, kullanılan methodlar bytecode’dan makine koduna çevrilir. Çünlü CPU üzerinde bu makine kodu çalışabileceği için hızlı response vermek amaçlanmaktadır.

Bu işlem sadece bir kere yapılmamaktadır. Sürekli istatiksel olarak izlenerek en çok kullanılan methodlar bytecode’dan makine koduna çevrilmektedir.

JIT derleyiciler platform bağımsız çalışmaktadır.

AOT(Ahead of Time) Compilers

Yazılan kodun doğrudan spesifik olarak donanımın anladığı makine koduna çevrilmesinden sorumlu derleyicilerdir. C/C++ gibi diller bu derleyicileri kullanmaktadır.

Direkt makine koduna çevrildiği için aot derleyiciler jit’den daha hızlıdır.

JDK

JDK, JRE, JVM

Java’da geliştirme yapmak için (Java Development Kit) ihtiyacımız vardır. Java Runtime Environment (JRE), yorumlayıcı / yükleyici (java), derleyici(javac), arşivleyici(jar), bir belge oluşturucu (javadoc) ve java geliştirmede gereken diğer araçlarıda içermektedir.

JDK = JRE + Java Compiler + Debugger

JRE

JDK, JRE, JVM

Java applet’lerini çalıştırmak için kullanıdığımız Java Plug-ini, JNLP(Java Network Launch Protocol) uzantılı linkleri tarayıcıdan açmamızı sağlayan Java Web Starter uygulaması bulunmaktadır. Kısacası bir java uygulamasını çalıştırmak için gerekli olan java kütüphanelerini ve JVM’i içermektedir.

JRE = Java Kütüphaneleri + JVM

Bu konulara değinmişken GraalVM ve Quarkus’a değinmeden olmazdı.

GraalVM ve Quarkus hakkında bigiler paylaşıp daha sonrasında yaptığım küçük uygulamalar ve performanslarına değineceğim.

GraalVM

GraalVM adındanda anlaşılacağı üzerine bir sanal makinedir ve Oracle tarafından geliştirilmiştir. Çok sayıda dili Java ve diğer JVM tabanlı diller, JavaScript, Ruby, Python, R ve C / C ++ ve (diğer LLVM tabanlı diller) destekleyen ve bunları farklı dağıtım senaryolarında (OpenJDK, Düğüm) çalıştıran kapsamlı bir ekosistem sunmaktadır.

GraalVM JVM’e göre JIT derleyicinde daha performanslı olduğunu iddia etmektedir. Ek olarak asıl fark yarattığı yer ise native-image yaratabilmesi ve en iyi performansı almamızı sağlamasıdır.

GraalVM native-image sayesinde java tabanlı dilleri AOT olarak derleyebilmemize olanak sağlamaktadır. Hatırlarsanız yazının başında JIT ve AOT arasındaki farklara değinmiştik. JVM’in yaptığı işlemler (istatik toplama gibi.) uygulamanın ayağa kalkmasını geciktirdiğinden bahsetmiştik. Buna ek olarak GraalVM native-image ile makine koduna derlenmiş kodlar sayesindede uygulamanın ayağa kalkışı hızlı olacaktır.

Fakat burada üzücü bir haberi vermek zorundayım ki ..

GraalVM native-image’de runtime olarak çalışmadan önce çalışma şekli net olarak tanımlanmış olması gerekmektedir. Bu sebepten reflection(IoC) kullanamamaktayız.

Burada aklımıza şu soru gelmektedir Spring Boot projelerinde ne yapacağız?.Biliyorsunuz ki Spring Boot IoC prensibi kullanmaktadır. Spring ve GraalVM bunun için çalışmalar yapmaktadır. Yakında bu soruna bir çözüm üreteceklerini bekliyorum. Ek olarak Spring bununla ilgili repository oluşturmuş inceleyebilirsiniz.

Ama native derlemekte ısrarcıysanız. Farklı bir alternatif olarak Quarkus’u deneyebiliriz.

Quarkus

https://quarkus.io/

Kendi sitelerinde açıkladıkları üzere

Supersonic Subatomic Java

A Kubernetes Native Java stack tailored for OpenJDK HotSpot and GraalVM crafted from the best of breed Java libraries and standards.

En iyi Java kütüphaneleri ve standartlarından hazırlanmış, OpenJDK HotSpot ve GraalVM’leri için uyarlanmış Kubernetes Native Java geliştirimi sağlayan bir birleşim olarak tanımlayabiliriz.

Bahsettiğimiz üzere Spring Boot projelerinde reflection olduğu için native derleyemiyorduk. Quarkus sayesinde AOT olarak uygulamamızı derleyerek paket büyüklüğünü azaltabilir ve ayağa kalkış hızını arttırabilmemiz mümkündür.

Yukarıda bahsettiğim bilgileri kendi sitelerinde paylaştıkları grafikler/testler ile görmek istersek;

Java JIT JVM ve GraalVM Testi

GraalVM’in kendi sitelerinde belirttikleri kodu test ettim. Ve sonuçlar gerçekten çok şaşırtıcıydı.

Fakat burada şunu belirtmem gerekiyor. İki işlemdede JIT olarak derlediğim için ayağa kalkış hızları aynıydı.

Belirtilen kodu JVM ile çalıştırdığımda,

JVM Testi

Ve GraalVM ile çalıştırdığımda,

GraalVM Testi

Spring Boot ve Quarkus JIT Testi

start spring ile bir web projesi oluşturdum.

quarkus sitesinde belirttiği üzere bir web projesi oluşturdum.

İkisindede bir api açtım ve “hello world” döndüm.

Spring Boot ayağa kalkış 1.652s olarak çıktı.

Quarkus ile hazırladığımız hello world projesi ise ayağa kalkış 0.775s olarak ayağa kalktığını gözlemlemiş olduk.

JIT olarak derlediğimiz halde ciddi anlamda ayağa kalkış hızı elde etmiş olduk.

Quarkus AOT Ayağa Kaldırma Testi

Quarkus’da native-image derlediğim hello world uygulaması ayağa 0.048s sürede ayağa kalktığını gördüm.

Quarkus’u JIT native-image olmadan derlediğimde ise 0.607s sürede ayağa kalktığını gördüm.

Yapacağım testler bukadardı başka bir yazıda görüşmek üzere :)

--

--