JVM Mimarisi

Merhabalar, bu yazımda Java Virtual Machine‘nin(JVM) hakkında bildiklerimi aktarmaya çalışacağım. Öncelikle google’a jvm yazdığınızda çıkan wikipedia sayfasında yer alan, JVM’in genel yapısını gösteren bir resimle başlıyorum.

1024px-jvmspec7

Resimden de görülebileceği gibi 3 temel bölüm var diyebiliriz. Class Loader, JVM Memory ve Execution Engines..

Temel olarak JVM‘in görevi Java uygulamalarını çalıştırmaktır diyebiliriz. Bir Java kodundaki ana metodu(main method) çağırır. JVM, JRE‘nin(Java Run Enviroment) bir parçasıdır.

Java uygulamaları WORA(Write Once Run Everywhere) prensibine sahiptirler. Geliştirici yazdığı Java kodunu, herhangi bir JVM yüklü platformda çalıştırabileceği anlamına gelir. Şimdi yukarıdaki resimde bahsettiğimiz 3 temel bölümü inceleyelim.

1. Class Loader Subsystem(Sınıf Yükleyici Alt Sistemi)

Bu bölümde ana 3 aktivite bulunur. Loading, Linking  ve Initialization..

1.1 Loading

Java‘da *.java uzantılı dosyalar derlendiğinde *.class uzantılı hale gelir. Class Loader. *.class uzantılı dosyaları okuyarak ikili verileri üretip metot bölgesine kaydeder. Her *.class dosyası için JVM, aşağıdaki bilgileri saklar.

  • Yüklenen sınıfın tam adı ve üst sınıfını.
  • .class dosyasının Class veya Interface veya Enum ile alakalı olup olmadığını.
  • Değişkenler ve metot bilgilerini.

*.class yükleme işleminden sonra, JVM bu .*class‘ı temsil etmek için heap memory‘de Class tipinde bir nesne oluşturur. Bu Class tipi java.lang paketinde tanımlanmıştır ve bu Class, programcı için nesne hakkında bilgi almalarda kullanılabilir.(Sınıfın adı, Parent adı, değişkenleri, metotları vs.)

Her yüklenen *.class dosyası için yalnızca bir Class nesnesi oluşturulur.

1.2 Linking (Bağlama)

Bu aşamada da verification, preparation ve opsiyonel olarak da resolution işlemleri uygulanır.

Verification(Doğrulama) : *.class dosyalarının doğruluğunun yapılması aşamasıdır. Doğrulamadan geçilemezse run-time java.lang.VerifyError hatası verir.

Preparation(Hazırlık) : JVM gerekli sınıf değişkenkerini memory’de yer ayırır ve varsayılan değelerini atar.

1.3 Initialization (Başlatma)

Bu aşamada, tüm statik değişkenler ve varsa statik blokta tanımlanan değerleriyle atanırlar. Genel olarak üç tane sınıf yükleyici vardır.

Bootstrap Class Loader(Önyükleme Sınıfı Yükleyicisi) : Her JVM uygulamasında güvenilen sınıfları yükleyebilen bir önyükleme sınıfı yükleyicisi olmalıdır. Bu loader, JAVA_HOME/jre/lib dizininde bulunan çekirdek java API sınıflarını yükler. Bu yol yaygın olarak önyükleme yolu olarak bilinir. Buradaki API’ler C, C ++ gibi yerel dillerde yazılmışlardır.

Extension Class Loader(Uzantı sınıfı yükleyicisi) : Önyükleme sınıfı yükleyicisinin child’dıdır. JAVA_HOME/jre/lib/ext (Uzantı yolu) uzantı dizinlerinde bulunan sınıfları veya java.ext.dirs sistem özelliği tarafından belirtilen başka bir dizini yükler. Java’da sun.misc.Launcher $ ExtClassLoader sınıfı tarafından uygulanmaktadır.

System/Application class loader(Sistem / Uygulama sınıfı yükleyici) : Uzantı sınıfı yükleyicinin child’dıdır.. Sınıfları uygulama sınıfı yolundan yüklemekle sorumludur. İçinde java.class.path ile eşlenen Environment Variable‘i kullanır. Ayrıca, Java’da sun.misc.Launcher $ ExtClassLoader sınıfı tarafından da uygulanır.

2. JVM Memory

JVM mimarisini 2. bölümüdür. Şekilde de görüldüğü gibi 5 alandan oluşmaktadır.

Method Area : Metod alanında, sınıf adı, ana sınıf adı, değişkenleri, metotları vs. gibi bilgiler saklanmaktadır. JVM başına yalnızca bir yöntem alanı vardır ve paylaşılan bir kaynaktır.

Heap Area : Tüm nesnelerin bilgilerini saklar.JVM başına bir heap alanı vardır ve paylaşılan bir kaynaktır.

Stack Area : Her iş parçacığı için, JVM burada saklanan bir çalışma zamanı yığını oluşturur. Bu yığının her bloğu, yöntem çağrılarını saklayan etkinleştirme kaydı / yığın çerçevesi olarak adlandırılır. Bu yöntemin tüm yerel değişkenleri, karşılık gelen çerçevede saklanır. Bir iş parçacığı sonlandıktan sonra çalışma zamanı yığını JVM tarafından yok edilir. Paylaşılan bir kaynak değildir.

PC Registers : Bir iş parçacığının geçerli yürütme talimatının adresini saklar.

Native Method Stacks : Her bir iş parçacığı için ayrı yerli yığın oluşturulur. Yerel metod bilgilerini depolar.

3. Execution Engine

Bu aşama da her *.class dosyalarını satır satır okur ve çalıştırır.3 aşaması vardır.

Interpreter : Bayt kodu satır satır olarak yorumlar ve yürütür. Buradaki dezavantaj, bir yöntem birden çok kez çağrıldığında, her yorumlama gerekliliğidir.

Just In Time Compiler : Interpreter verimliliğini artırmak için kullanılır.Tüm bayt kodunu derleyip yerel koda çevirir, böylece Interpreter tekrarlanan metod çağrılarını gördüğünde, JIT bu bölüm için doğrudan yerel kod sağlar, böylece yeniden yorumlama gerekli değildir, ve verimlilik artmış olur.

Garbage Collector : Referans edilmemiş nesneleri yok eder.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s