Java Virtual Machine(JVM) Architecture 2

Kerim Fırat
3 min readMay 17, 2021

--

Java Virtual Machine(JVM) Architecture 1 makalesine buradan erişebilirsiniz.

Runtime Data Alanı

Runtime data alanı bünyesinde 5 adet bileşen barındırır. Aşağıda bu bileşenlere ait görünüme yer verilmiştir.

Bileşenleri sırayla inceleyelim.

Method Area
Tüm class düzeyindeki veriler bu alanda saklanır.
Bu alanda bulunan bellek miktarı programın başlatılması için yeterli değilse, bu durumda JVM bir “OutOfMemoryError” hatası fırlatacaktır.
Bu alanı daha detaylı inceleyebilmek için aşağıda verilen kod parçasını inceleyelim. Örneğin aşağıdaki class tanımına sahip olduğumuzu varsayalım:

Bu kod örneğinde “name” ve “age” gibi değişken verileri ve “Constructor” ayrıntıları “Method Area” alanına yüklenir. Method area,JVM başlangıcında oluşturulur ve her JVM yalnızca bir adet “Method Area”’a sahip olabilir.

Heap Area
Tüm nesnelere ait değerler-bilgiler Heap Area’da saklanır.
Örneğin,aşağıda verilen tanımlamayı inceleyelim.

Person mPerson = new Person();

Bu kod örneğinde,bir “Person” nesnesi oluşturulur ve Heap Area’a yüklenir.
Yine “Method Area”’da olduğu gibi,Heap Area JVM başlangıcında oluşturulur ve her JVM yalnızca bir adet “Heap Area”’a sahip olabilir.

NOT: “Method Area” ve “Heap Area” alanları çoklu iş parçacıkları(Multiple Thread) için belleği paylaştığından dolayı,depolanan veriler iş parçacığı(Thread) açısından güvenli değildir.

Stack Area
JVM’de yeni bir iş parçacığı(Thread) oluşturulduğunda,aynı anda ayrı bir çalışma zamanı yığını da oluşturulur.Yani her Thread için bir çalışma zamanı yığını oluşturulur. Tüm global değişkenler,method çağrıları ve kısmi sonuçlar bu alanda saklanır.
Ve bir thread sona erdikten sonra,bu çalışma zamanı yığını JVM tarafından yok edilir.Ayrıca bu alan paylaşılan bir alan değildir.

Bir thread’da yapılan işleme,mevcut olandan daha büyük bir yığın boyutu gerektiriyorsa,bu durumda JVM “StackOverflowError” hatası fırlatacaktır.

Her method çağrısı için yığın belleğine “Stack Frame(Yığın Çerçevesi)” adı verilen bir giriş yapılır. Method çağrısı tamamlandığında Stack Frame yok edilir.

Stack Frame üç alt bölüme ayrılmıştır. Bunlar “Local Variables,Operand Stack,Frame Data” olarak isimlendirilmiştir. Bu bölümlere aşağıda yer verilmiştir.

  • Local Variables(Yerel Değişkenler):Her çerçeve,yerel değişkenler olarak bilinen bir dizi değişken içerir. Tüm yerel değişkenler ve bu değişkenlere ait değerler burada saklanır.Bu dizinin uzunluğu derleme zamanında belirlenir.
  • Operand Stack(İşlenen-İşlemsel Yığın): Her çerçeve,işlemsel yığın olarak bilinen son giren ilk çıkar(LIFO) yığını içerir. Bu,herhangi bir ara işlemin gerçekleştirilmesi gerekiyorsa,operand stack işlemi gerçekleştirmek için çalışma zamanı çalışma alanı görevi görür.
  • Frame Data(Çerçeve Verileri): Method’a karşılık gelen tüm semboller burada saklanır. Bu ayrıca try-cath bloğu bilgilerini de depolar.

Stack bölümünü sonlandırırken,Stack ve Heap ile ilgili aşağıda verilen bilgiler faydalı olacaktır.

Kısaca Stack:
-Derleme zamanında oluşur.
-LIFO(Last In First Out) son giren ilk çıkar mantığında çalışır.
-Kolay ve hızlı kullanıma sahiptir.
-Veriler Big and Little Endian adres mantığında tutulur.
-Yaşam süresi(life time) kısa olan değişkenler tutulur.
Örn:yerel(local) değişkenler.
-Bir uygulamada tek bir stack yoktur. Yukarıda da belirttiğim gibi her bir Thread’in kendi stack’i vardır.
-Bir stack üzerindeki veriye ancak kendi thread’i erişebilir.Dolayısıyla başka bir thread kendisine ait olmayan veriye erişemez.

Kısaca Heap:
-Heap boyut olarak stack’dan büyüktür.
-Stack’e göre büyük boyuta sahip olduğu için Stack’e göre yavaştır.
-Heap çalışma zamanında oluşturulur.
-Dynamic allocation(dinamik tahsis) için doğru bir tercihtir.
-Bir uygulamada tüm thread’lar için tek bir heap bulunur.

Bir class’a ait Stack ve Heap bölümlerini gösteren bir görüntüye aşağıda yer veriliyor:

PC(Program Counter) Register
JVM aynı anda birden fazla iş parçacığını(Multiple Thread) destekler.Her iş parçacığı,o anda yürütülen JVM talimatlarının adresini tutmak için kendi PC Register’a sahiptir.Talimat yürütüldüğünde,PC kaydı bir sonraki talimatla güncellenir.Dolayısıyla her thread’in ayrı PC Register’ları vardır.

Native Method Stacks
JVM,native methodları destekleyen stack’lar içerir.Native methodlar C ve C++ ile yazılır. Dolayısıyla her thread için ayrı bir native stack oluşturulur ve bu stack,native methodları depolar.

-end of

--

--

Kerim Fırat

Senior C++,Android Platform(AOSP,AAOS) Developer,Performance Architect,Open Source Contributor | Turkey Java User Group Vice Chairman | Author