Merhaba arkadaşlar, bu yazımda Heap ve Stack bellekleri arasındaki farkları anlatacağım. Şimdi sırası ile bu bellekleri inceleyelim ve daha sonra farklarına bakalım.
Heap Bellek
Java heap belleği, java çalışma zamanı(Java Runtime) tarafından nesnelere ve JRE sınıflarına bellek ayırmak için kullanılır. Ne zaman bir nesne oluştursak, o her zaman heap belleğinde oluşturulur.
Garbage Collector(Çöp Toplayıcı), referansı olmayan nesneler tarafından kullanılan belleği boşaltmak için heap bellekte çalışır. Heap alanında oluşturulan herhangi bir nesneye genel(global) erişim vardır ve uygulamanın herhangi bir yerinden ulaşılabilir.
Stack Bellek
Java stack belleği bir thread yürütülmesi için kullanılır. Kısa ömürlü olan fonksiyona özel değerler ve fonksiyondaki referansta bulunan heapteki diğer nesnelere referans içerirler. Stack belleğine her zaman LIFO(Last In First Out)(Son giren ilk çıkar) sırasında kullanılır. Bir metot çağrıldığında, yerel primitive değerleri tutma ve metottaki diğer nesnelere gönderme yöntemi için yeni bir blok oluşturulur.
Metot sona erer ermez, blok kullanılmaz hale gelir ve bir sonraki metot için kullanılabilir hale gelir.
Stack belleğinin boyutu Heap belleğine göre çok daha azdır.
Heap-Stack Bellekleri Arasındaki Farklar
- Heap bellek uygulamanın tüm bölümleri tarafından kullanılırken, stack bellek yalnızca bir Thread tarafından kullanılır.
- Bir nesne oluşturulduğunda, her zaman heap belleğinde saklanır ve stack bellek ona referans içerir. Stack bellek yalnızca local primitive(ilkel) değişkenleri ve heap belleğindeki değişkenlerin referanslarını içerir.
- Heap belleğinde depolanan nesnelere global olarak erişilebilir, oysa stack belleğine diğer bölümler tarafından erişilemez.
- Stack de bellek yönetimi LIFO tarzında yapılırken, Heap belleğinde daha karmaşıktır çünkü globaldir.
- Stack bellek kısa ömürlüdür, Heap bellek ise uygulama yürütme başlangıcından sonuna kadar yaşar.
- Başlangıç boyutunu ve Heap belleğinin maksimum boyutunu tanımlamak için –Xms ve Xmx JVM seçeneğini kullanabiliriz. Stack bellek boyutunu tanımlamak için –Xss kullanabiliriz.
- Stack bellek dolduğunda, Java çalışma zamanı(Java runtime) java.lang.StackOverFlowError objesini atarken, Heap belleği doluysa java.lang.OutOfMemoryError objesini atar.
- Stack bellek boyutu, Heap bellek ile karşılaştırıldığında çok daha azdır. Bellek ayırmada (LIFO) basitlik nedeniyle Stack bellek Heap belleğe göre çok hızlıdır.
Şimdi aşağıdaki örneği inceleyelim:
Bu yazımı burada bitiriyorum diğer yazılarımda görüşmek üzere.
Anlatım için teşekkürler.
Resimdeki örneğe göre int index = 100; stack tir. Orada sanırım anlatım hatası var.
Çünkü değer tipli değişkenler referans tutmazlar ve belleğin stack alanında tutulurlar.