Bir proses çalıştığında kendisine stack ve heap üzerinede yerler ayrılır.
Peki stack ve heap nedir?
İşte budur:
Stack,
- bir thread çalıştırıldığında bellekte thread ile ilgili yerel değişkenler ve metotlar için ayrılan yerdir.
- LIFO (Son giren ilk çıkar) mantığına göre çalışır.
- Fonksiyon çalıştırıldığında stack'in en üstünde bir blok ayrılır(mavi kutuları blok olarak düşünün). Bu blok içinde fonksiyon içindeki değişkenlerin (ki bu değişkenler de heap üzerinde yaratılır -sarı kutucukları düşünebilirsiniz bu değişkenler/nesneler için-) adreslerini bulunur. Fonksiyon değer döndükten ya da fonksiyonun kod bloğu bittikten sonra stack üzerinde kullanılmayan olarak bir sonraki çağırılmasını bekler.
- Görüldüğü üzere stack çok basit bir mantık ile çalışır. Takip edilmesi kolaydır.
- Stack üzerindeki blokların çağırılması çok sık olabileceği için işlemcinin cache ine de maplenir. Bu da onu heapten daha hızlı kılar.
- Stack için ayrılan bölge proses çalıştırıldığında set edilir. (genellikle program başlatıldığında sistem ne kadar yer gerektiğini bilir ama sizde bunu set edebilirsiniz. Bu bölgedeki boyut geçilirse "stack overflow" hatası alırsınız.)
Heap,
istediğmiz zaman ve istediğimiz yerde blok ayırmamızı sağlayan ve takip edilmesi daha karmaşık xbir bellek bölgesidir ve keyfe keder yer ayırıp silebilmemize olanak veren bu yapısından dolayı daha yavaştır.
Heap dinamik olduğu için prosesin çalıştırıldığında ayrılan boyutu, dinamik olarak OS tarafından arttırılabilir.
Güzel bir resimle pekiştirelim (kaynak vererek tabii: http://vikashazrati.files.wordpress.com/):
Kaynak: http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx