Blog

“Memory Heap” Kavramı Nedir, Ne işe Yarar?

Bu yazımızda, bilgisayar bilimlerinin temel konseptlerinden biri olan “Memory heap” kavramından bahsedeceğiz ve JavaScript üzerindeki kullanımını göstereceğiz.

“Memory Heap” Nedir?

“Memory heap” nedir sorusunu kısaca; “Programın çalışması sırasında dinamik olarak ayrılan bellek alanıdır” şeklinde bir cevap verebiliriz.

Doğrudan Türkçeye çevrildiğinde “bellek yığını” anlamına gelse de, bilgisayar bilimleri bağlamında daha spesifik ve teknik bir anlam taşır. Bu anlam, dinamik bellek tahsislerinin gerçekleştiği bellek bölgesini ifade eder.

JavaScript’te “Memory Heap” Kullanımı

V8 JavaScript motoru yazımızda da belirttiğimiz üzere bir JavaScript motoru, stack ve heap adında iki ana hafıza bileşeninden oluşmaktadır. Bu iki yapı, her ne kadar RAM (Random Access Memory) kullansa da aralarında önemli farklar bulunmaktadır.

  • Heap: Dinamik olarak tahsis edilen bellek alanıdır. Yani, program çalışırken ihtiyaç duyulan ve boyutu önceden belirlenemeyen veri yapıları için bellek tahsis edilen alandır. Özellikle, nesneler, diziler ve diğer karmaşık veri yapıları için kullanılır. Ayrıca, belleğin spesifik adresi veya yeri genellikle programcı tarafından doğrudan bilinmez veya kontrol edilmez.
  • Stack: Değişkenler ve fonksiyon çağrıları için ayrılan bellek alanıdır.

“Memory heap”, bilgisayarın RAM’inde dinamik olarak ayrılan ve yönetilen bir hafıza bölgesidir. Diğer adıyla “heap” olarak da bilinir ve genellikle uygulamaların “runtime” (çalışma zamanında) dinamik olarak bellek tahsisi yapmaları gerektiğinde kullanılır. “Stack”in aksine, “heap” üzerindeki bellek tahsisleri, boyutları ve yaşam süreleri compile (derleme) zamanında bilinmez. Örneğin:

Yukarıdaki kodumuzda, foo() fonksiyonu çağrıldığında sırasıyla bar() ve baz() fonksiyonları da çağrılıyor. Son olarak, baz() fonksiyonu içinde console.log ile bir mesaj yazdırılıyor. Peki bellek tahsisi ve fonksiyonların çağrıları nasıl olmuştur sizce? Resim üzerinde gösterelim:

  • Heap: Nesneler için kullanılır. Ancak, örnek programda herhangi bir nesne oluşturma işlemi yok. Bu nedenle, heap’te belirli bir nesne gösterimi bulunmamaktadır (sadece genel bir gösterim olarak yeşil kutular var).
  • Stack: Fonksiyon çağrıları ve yerel değişkenler burada saklanır. Resimde foo(), bar(), baz() ve console.log(...) fonksiyonlarının sırasıyla nasıl stack’e eklendiğini görebiliriz. Fonksiyonların nasıl çağrıldığına ve tamamlandığına bağlı olarak stack’in nasıl büyüyüp küçüleceğini hayal edebilirsiniz.

Resimde de görüleceği üzere, fonksiyonlar “stack” üzerinde saklanmaktadır ve bunların çağrıları “call stack” olarak adlandırılmaktadır. Bu yapı, “İlk Giren Son Çıkar” (FILO) felsefesinde çalışan, programın çalışması sırasında çağrılan fonksiyonların sıralandığı ve yönetildiği veri yapısıdır.

Örneğimizde de ilk olarak foo() fonksiyonu çağrılmıştır. Daha sonra, foo() içerisinde bar() fonksiyonu çağrılır. Ardından, bar() içerisinde sıradaki fonksiyon olan baz() çağrılır. Son olarak, baz() fonksiyonu içerisinde “Hello from baz” mesajını ekrana yazdırmak için console.log komutu çalıştırılır. Bu sıralamada, fonksiyonlar iç içe çağrıldığı için en dıştaki fonksiyondan başlayarak en içteki fonksiyona doğru ilerlenir.

Çıkış sırasına gelirsek; ilk olarak console.log komutu tamamlanır ve baz() fonksiyonu sona erer. Daha sonra, baz() fonksiyonunun tamamlanmasının ardından bar() fonksiyonu sonlanır. En son olarak, tüm iç fonksiyonların tamamlanmasından sonra foo() fonksiyonu sona erer. Bu şekilde fonksiyonlar, en içteki fonksiyondan başlayarak en dıştaki fonksiyona doğru tamamlanmış olur.

Böylece “call stack” ve “memory heap” arasındaki fark nedir sorusunun da cevabı ortaya çıkmaktadır; biri, programın çalışmasını belirlerken, diğeri ise programın çalışması sırasında oluşturulan nesnelerin ve verilerin depolandığı alandır.

“Memory heap”in kullanımı, programın performansını etkileyebilir. Eğer bir program yeterli bellek bulamazsa yavaşlayabilir veya çökme riski taşır.

Neyse ki, JavaScript’te “memory heap” yönetimi otomatik olarak gerçekleştirilir. Neden mi? Çünkü JavaScript motoru otomatik bellek yönetimi için bir dizi algoritma kullanır. Garbage collector adı verilen bu yapı artık kullanılmayan bellek bloklarını belirler ve bunları tekrar kullanabilmek adına geri kazanır.

Ancak hiçbir sistem nihayetinde mükemmel olmadığı için “memory leaks” adı verilen bazı bellek sızıntıları da görülebilmektedir.

İlgili Makaleler

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu

😔 Reklam Engelleyicisi 😔

Sitenin varlığını sürdürebilmesi adına reklam engelleyicinizi (Adblocker) kapatmanızı rica ediyoruz 😔