4 Nisan 2020 Cumartesi

Java Memory Yönetimi

Selamlar :) 

    Temel prensipleri ile Java'nın Memory yönetimini açıklayacağım. Yorum ve soru ve yönlendirmeleriniz ile içeriği zenginleştirebiliriz. 

   Yazdığımız her bir kod satırı Memory problemleri oluşturmaya adaydır. Öncelikle bu durumu kabullenip olası problemleri, açık kaynaklı ürünler ile nasıl çözümleyebileceğimizi değerlendireceğiz. 

   Öncelikle Java'da memory yönetimi nasıl yapılır kısaca ele alalım.


Java Memory

  • Nasıl Çalışır?(Stack ve Heap)
     Oluşturduğumuz her bir Obje Memory de tutulmaktadır. Memory ise Stack ve Heap olarak iki parçadan oluşmaktadır.


Stack(256kB to ≤ Heap Size): 

Yaygın olarak kullanılan Memory alanıdır. Her bir thread'e özel Stack oluşturulur. Stack JVM(Java Virtual Machine)   tarafından kullanılan en verimli memory parçacığıdır. Stack'in en önemli yönü ise JVM'in  Stack'de konumlandırılan verinin ne zaman silineceğini tam olarak bilmesidir.

  • Çalışma Prensibi:
     Stack'e yeni bir veri eklendiğinde ilgili veri stack'in en üst satırında konumlandırılır. 
Yeni bir veri eklenir ise ilk veri bir satır aşağı kaydırılır. Silme adımında ise sıralama en üstten başlar, son eklenen veri ilk silinen verirdir. 

Kısaca LIFO(Last in First Out) mantığı ile çalışır. 
Primitive Değişkenler ve Obje Referansları(Kendisi değil) Stack'de tutulur.


.  En temelde çalıştırabilir methodlara main method denir. Her bir main method bir thread'e bağlıdır. 
    Main method oluştuğunda String tipinde 
bir dizi oluşur. Dizi String'den oluştuğu için heap'de konumlanır ve memory referansı stack ile paylaşılır. args dizisinde yapılan her bir değişiklik heap'e yansır. 


Main method tetiklendiğinde öncelikle sırasıyla value Stack'de oluşur. value'a yeni değer atanması için calculate methodu çağırılır. calculate methodunun parametre olarak aldığı data değeri value'nin kopyası olarak oluşturulur ve stack de konumlanır. 

    Sırasıyla tempValue ve newValue oluşturulur ve return ile son değer main methoda aktarılır. Method görevini tamamladığında içerisinde tanımlı bütün primitive tipler silinir.
value yeni değerini almıştır. Yeni bir işlem olmadığı için stack'de bulunan tüm data silinir. 

Main method ile ilişkili thread'in yaşamına JVM tarafından son verilir :) Mutlu son...

Stack sadece Primitive Type'lar için kullanılır....


Heap(2 MB to ≤ ∞);

     Jvm tarfinden yönetilen diğer memory katmanı ise Heap'dir. Heap yaşam döngüsü method yada fonksiyon scobe'larından uzun olan Objeleri barındırır. Stackler arasında veri paylaşımı yapabilir. Örneklendirmek gerekir ise veri tutmak için fiziksel memory'nin izin verdiği kadar büyük bir alana sahibiz. 

    Primitive Type'lar haricindeki herşey (ki bunlar Objedir) Heap'de tutulur.

Method içerinde bir obje oluşturulduğunda, ilgili obje heap'de konumlanır ve obje referansı Stack'de konumlandırılır.

Methodun görevi bittiğinde primitive type silinir. name isimli referans silinir fakat Heap'de konumlanan değişken silinmez. Heap'deki değişkenleri eğer değişkenlerin aktir referansları yok ise Garbage Collector siler. 

Heap'de konumlanan değişkenlerin yaşam döngüsü Stack'den daha fazladır.