Merhabalar arkadaşlar. Bu yazıda Java ve Heap&Stack Memory ilişkisini anlatmaya çalışacağım.

Java Heap Memory

Heap memory Java çalışma ortamı (Java Runtime) tarafından objelere ve JRE sınıflarına yer vermek için kullanılır.Biz bir nesne oluşturduğumuzda bu nesne her zaman heap memory içinde oluşturulur. Bizim Çöp Toplayıcı adını verdiğimiz Garbage Collector herhangi bir referansa sahip olmayan nesneleri temizlemek, yer açmak için heap memory üzerinde çalışır. Heap space’de oluşturulmuş tüm objeler global ulaşım ve uygulamanın tüm yerlerinden referans edilme hakkına sahiptir.

Java Stack Memory

Stack memory bir Thread’in çalıştırılması için kullanılır. Method için özelleşmiş değerleri tutar ve bu değerler kısa ömürlüdür, heap memory’deki nesnelere referansta bulunurlar. Stack memory her daim LIFO (Last in First out) mantığında çalışır. Bir metot tetiklendiğinde o metodun local primitive ve referans değişkenleri için stack memory içinde o metot için bir blok oluşturulur. Metot bittiğinde o blok yeni bir metot için kullanılabilir hale getiriliyor. Stack memory’nin hafıza boyutu heap memory’ninkinden çok daha azdır.

Serkan Sakınmaz’ın bloğunda şöyle güzel bir örnek vardı, ben de bu yazıda onu aldım.

[]

Bu resimde göreceğimiz üzere Java sınıfı içinde instance ve class variable olarak tanımlanan değişkenler heap memory’de tutulur. Metotlar ve onlara özgü değişkenler de stack’de tutulur. Değişkenlerin oluşturulduğu sınıflar da heap’de tutulur ve oradan çağırılır. method() metodu içinde cities stack’de tutulurken onun oluşturulmasını sağlayan ArrayList sınıfı heap üzerinden çağırılır.

Heap Ve Stack Memory Arasındaki Farklar

  1. Heap memory uygulamanın tamamı tarafından kullanılabiliyorken stack memory sadece Thread çalıştırılması için kullanılır.
  2. Bir nesne oluşturulduğu zaman heap memory de saklanır ve stack memory ona ait bir referans tutulur. Stack memory sadece local primitive değerleri ve heap memory’deki nesnelere referansta bulunan değişkenleri tutar.

[]

  1. Heap memory’deki nesneler tüm uygulama tarafından ulaşılabilir durumda iken stack memory’deki nesneler başka Thread’ler tarafından ulaşılamaz durumdadır.
  2. Stack memory’deki bellek yönetimi basitken ve LIFO mantığına dayanırken heap memory’deki belek yönetimi çok daha karışıktır. Buna sebep olan şey Heap Memory’nin çok daha büyük olmasıdır. Heap memory’nin yönetimi için Garbage Collection algoritmaları kullanılır.
  3. Stack memory kısa ömürlü olurken heap memory uygulamanın başından sonunda kadar tutulur.
  4. -Xms ve -Xmx JVM komutları ile heap memory’nin boyutları belirlenebilir. -Xss ile de Stack memory.
  5. Stack memory dolarsa java.lang.StackOverFlowError hatası, heap memory dolarsa java.lang.OutOfMemoryError: Java Heap Space hatası alırız.
  6. Stack memory hem boyut olarak hem de bellek yönetimi olarak daha basit olduğundan heap memory’e göre daha hızlı hareket eder.

Heap ile Stack memory hakkında elimden geldiğince bilgi vermeye çalıştım. Kod yazarken bu unsurlara dikkat etmeliyiz arkadaşlar. Çünkü performans ve bellek yönetimi en mühim noktalardır. Örneğin gerek olmadığı halde gidip heap’de sürekli kalacak şekilde nesne tanımlaması yaparsak, referansa sahip olursa bu nesne uygulama hayatta kaldığı o bellek bölgesini işgal edecek. Garbage collector da onu silemeyecek. Size izlemeniz için iki video linki de paylaşıyorum: https://www.youtube.com/watch?v=jzJjMefsFKE https://www.youtube.com/watch?v=_y7k_0edvuY

Alican Akkuş bu noktada yazıya bir ekleme yaptı. Kendisine teşekkür ederim. Local object. Local object diye birsey yoktur, heap’de var olan bir objeye işaret eden local degisken vardır. Her obje heap’de tutulur ve buna referans olan degiskenin nerede oldugu onemsizdir, ister local olsun ister olmasın.

Emrah Pekesen de şöyle bir ekleme yaptı, kendisine teşekkür ederim: Method ismindeki “method” un işaretçisi de (function pointer) stack te durur.

Başka bir yazıda görüşene kadar sağlıcakla kalın arkadaşlar. (2. maddedeki resmin kaynağı : http://javarevisited.blogspot.com.tr/2013/01/difference-between-stack-and-heap-java.html )