Java Sanal Makinesi (JVM), Java programlarının herhangi bir platformda değişiklik yapılmadan çalıştırılmasına olanak tanıyan Java Runtime Environment'ın (JRE) temel bir bileşenidir. JVM, Java bayt kodu ile Java'nın ünlü Bir Kez Yaz, Her Yerde Çalıştır (WORA) özelliğini sağlayan temel donanım arasında bir yorumlayıcı görevi görür.
- Java kaynağı (.java) -> javac tarafından derlendi -> bayt kodu (.class)
- JVM bayt kodunu yükler, onu bağladığını doğrular ve ardından çalıştırır
- Yürütme, performans kodunu yerel makine koduna dönüştürmek için bayt kodunun yorumlanmasını veya Tam Zamanında (JIT) derlemesinin kullanılmasını içerebilir.
- Çöp toplama, kullanılmayan nesnelerden belleği geri kazanmak için arka planda çalışır
JVM'nin mimarisi
Aşağıdaki resim JVM'nin mimarisini ve temel bileşenlerini göstermektedir.
JVM Mimarisinin Bileşenleri
Şimdi JVM'nin her bileşenini ayrıntılı olarak tartışacağız.
1. Sınıf Yükleyici Alt Sistemi
Temel olarak üç faaliyetten sorumludur.
1. Yükleme
- .class dosyalarını okur ve sınıf meta verilerini Yöntem Alanında saklar.
- Yüklenen sınıfı temsil eden yığında bir Class nesnesi oluşturur.
class GFG{ static{ System.out.println('GFG class is loaded by the JVM!'); } public void display(){ System.out.println('Method of GFG class is executed.'); } } public class Test{ public static void main(String[] args) throws Exception{ System.out.println('Main method started.'); // Loading the class explicitly using Class.forName() Class.forName('GFG'); System.out.println('Class loaded successfully.'); // Creating object to execute method GFG obj = new GFG(); obj.display(); } }
Çıkış
Main method started. GFG class is loaded by the JVM! Class loaded successfully. Method of GFG class is executed.
Not: Her yüklenen için .sınıf yalnızca dosya bir sınıfın nesnesi oluşturulur.
2. Bağlama: Yüklenen sınıfın yürütmeye hazırlanmasından sorumludur. Üç adım içerir:
- Doğrulama: Bayt kodunun JVM kurallarına uymasını ve yürütülmesinin güvenli olmasını sağlar.
- Hazırlık: Statik değişkenler için bellek ayırır ve varsayılan değerleri atar.
- Çözünürlük: Sembolik referansları bellekteki doğrudan referanslara dönüştürür.
3. Başlatma
- Gerçek değerleri statik değişkenlere atar.
- Sınıfta tanımlanan statik blokları çalıştırır.
Sınıf Yükleyici Türleri
- Bootstrap Sınıfı Yükleyici: Temel Java sınıflarını yükler (JAVA_HOME/lib).
- Uzatma Sınıfı Yükleyici: Sınıfları uzantı dizininden yükler (JAVA_HOME/jre/lib/ext).
- Sistem/Uygulama Sınıfı Yükleyici: Uygulama sınıf yolundan sınıfları yükler.
// Java code to demonstrate Class Loader subsystem public class Geeks { public static void main(String[] args) { // String class is loaded by bootstrap loader and // bootstrap loader is not Java object hence null System.out.println(String.class.getClassLoader()); // Test class is loaded by Application loader System.out.println(Geeks.class.getClassLoader()); } }
Çıkış
null jdk.internal.loader.ClassLoaders$AppClassLoader@8bcc55f
2. JVM Bellek Alanları
- Yöntem Alanı: Sınıf adı üst sınıf yöntemleri değişkenleri ve statik veriler gibi sınıf düzeyindeki bilgileri depolar. JVM genelinde paylaşılır.
- Yığın Alanı: Tüm nesneleri saklar. JVM genelinde paylaşılır.
- Yığın Alanı: Her iş parçacığının kendi çalışma zamanı yığını vardır; mağaza yöntemi yerel değişkenleri yığın çerçevelerinde çağırır. Konu bittiğinde yok edilir.
- PC Kayıtları: Her iş parçacığı için şu anda yürütülen talimatın adresini tutun.
- Yerel Yöntem Yığınları: Her iş parçacığının yerel yöntem yürütmesi için ayrı bir yığını vardır.
3. Yürütme Motoru
Yürütme motoru .class'ı (bayt kodu) yürütür. Bayt kodunu satır satır okur, çeşitli hafıza alanlarında bulunan veri ve bilgileri kullanır ve talimatları yürütür. Üç bölüme ayrılabilir:
- Tercüman: Bayt kodunu satır satır yorumlar ve ardından çalıştırır. Buradaki dezavantaj, bir yöntemin birden çok kez çağrılması durumunda her seferinde yorumlamanın gerekli olmasıdır.
- Tam Zamanında Derleyici (JIT): Tercümanın verimliliğini artırmak için kullanılır. Bayt kodunun tamamını derler ve onu yerel koda dönüştürür; böylece tercüman tekrarlanan yöntem çağrılarını gördüğünde JIT o kısım için doğrudan yerel kod sağlar, böylece yeniden yorumlamaya gerek kalmaz ve böylece verimlilik artar.
- Çöp Toplayıcı: Referans verilmeyen nesneleri yok eder. Çöp Toplayıcı hakkında daha fazla bilgi için bkz. Çöp Toplayıcı .
4. Java Yerel Arayüzü (JNI)
Yerel Yöntem Kitaplıkları ile etkileşime giren ve yürütme için gereken yerel kitaplıkları (C C++) sağlayan bir arayüzdür. JVM'nin C/C++ kitaplıklarını çağırmasını ve donanıma özel olabilecek C/C++ kitaplıkları tarafından çağrılmasını sağlar.
5. Yerel Yöntem Kitaplıkları
Bunlar, yerel yöntemleri yürütmek için gereken yerel kitaplık koleksiyonlarıdır. C ve C++ gibi dillerde yazılmış kütüphaneleri içerirler.