Heap Belleği
- İngilizcesi
- Heap Memory
- Türkçe karşılığı
- öbek belleği, dinamik bellek
- Okunuşu
- hiip memıri
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
Heap belleği, boyutu ya da ömrü önceden bilinmeyen, çalışma zamanında ayrılan ve onu oluşturan fonksiyondan uzun yaşayabilen verilerin tutulduğu bölgedir.
Heap belleği (heap memory) nedir?
Stack'in aksine heap'in sabit bir sırası yoktur. Bir program ihtiyaç duyduğunda bir bellek bloğu ister: C'de malloc, C++ ve Java'da new ile, ya da Python ve JavaScript gibi dillerde bir nesne, liste veya string oluşturduğu her seferde örtük olarak; blok da serbest bırakılana kadar geçerli kalır. Bu, heap'i büyük veri, boyutu değişen veri ve fonksiyonlar arasında paylaşılan veri için doğru yer yapar.
Bu belleği birinin serbest bırakması gerekir. C ve C++'ta bunu programcı free ya da delete ile yapar; unutmak bellek sızıntılarına, çok erken serbest bırakmak da önemli bir güvenlik açığı kaynağı olan use-after-free hatalarına yol açar. Rust belleği güvenle serbest bırakmak için sahipliği (ownership) derleme zamanında izler; Java, C#, Python, Go ve JavaScript gibi diller de artık erişilemeyen nesneleri bulup serbest bırakan bir çöp toplayıcı kullanır.
Heap ayırma stack ayırmadan daha yavaştır: ayırıcının doğru boyutta boş bir blok bulması, neyin kullanımda olduğunu izlemesi ve boş belleğin kullanılamayacak kadar küçük boşluklara bölündüğü parçalanmayla (fragmentation) uğraşması gerekir. Bu yüzden performansa duyarlı kod nesneleri yeniden kullanır, toplu ayırma yapar ya da küçük ve kısa ömürlü değerleri stack'te tutar.
Sık yapılan bir yanlış, heap bellek bölgesinin heap veri yapısıyla bir ilgisi olduğunu düşünmektir. Yalnızca adlarını paylaşırlar: bellek heap'i bir ayırıcının yönettiği bir havuzdur; heap veri yapısı ise öncelik kuyrukları için kullanılan bir ağaçtır.
Önemli noktalar
- Heap, boyutu ve ömrü esnek, çalışma zamanında ayrılan veriyi tutar.
- Bir fonksiyon çağrısından daha uzun yaşayan nesneler heap'te yaşar.
- C ve C++ onu elle serbest bırakır; Rust sahiplik, diğerleri çöp toplama kullanır.
- Heap ayırma stack'ten daha yavaştır ve parçalanabilir.
- Bellek heap'inin heap veri yapısıyla ilgisi yoktur.
Örnek
#include <stdlib.h>
#include <string.h>
char *make_greeting(const char *name) {
char local[16] = "Hello, "; // stack: gone when the function returns
size_t len = strlen(local) + strlen(name) + 1;
char *greeting = malloc(len); // heap: survives the return
if (!greeting) return NULL;
strcpy(greeting, local);
strcat(greeting, name);
return greeting; // the caller now owns this memory
}
int main(void) {
char *g = make_greeting("Ada");
/* ... use g ... */
free(g); // forget this and you have a memory leak
return 0;
}Sık sorulan sorular
Bellek ne zaman heap'te ayrılır?
Boyutu derleme zamanında bilinmediğinde, büyük olduğunda ya da onu oluşturan fonksiyondan daha uzun yaşaması gerektiğinde. Java, Python ve JavaScript gibi yönetilen dillerde nesnelerin çoğu otomatik olarak heap'te ayrılır.
Heap'te bellek sızıntısı nedir?
Artık ihtiyaç duyulmayan ama program onu serbest bırakmayı unuttuğu ya da hâlâ ona bir referans tuttuğu için hiç serbest bırakılmayan heap belleğidir. Programın bellek kullanımı da zamanla büyür.
Heap belleği ile heap veri yapısı aynı şey mi?
Hayır. Bellek heap'i, bir ayırıcının yönettiği bir bellek bölgesidir. Heap veri yapısı ise en küçük ya da en büyük öğeyi en üstte tutan bir ağaç türüdür. Yalnızca adları ortaktır.
Sık karşılaştırılanlar
İlgili sayfalar
- Stack Belleğiİşletim Sistemleri, s. 29Stack belleği, bir thread'in fonksiyonlarının yerel değişkenlerini ve dönüş adreslerini tuttuğu bölgedir; her çağrıda büyür, dönüşte otomatik olarak küçülür.
- Çöp toplamaProgramlamanın Temelleri, s. 9Çöp toplama, dil çalışma zamanının programın artık kullanamadığı verileri bulup bu belleği yeniden kullanıma açtığı otomatik bellek yönetimidir.
- Memory Leakİşletim Sistemleri, s. 20Memory leak, bir programın artık ihtiyaç duymadığı belleği tutmayı sürdürdüğü hatadır; bellek kullanımı zamanla artar, sistem yavaşlayabilir ya da çökebilir.
- İşaretçiProgramlamanın Temelleri, s. 29İşaretçi, başka bir değerin kendisi yerine bellek adresini saklayan bir değişkendir; kodun o veriyi dolaylı yoldan okumasına ya da değiştirmesine imkân tanır.
- Sanal Bellekİşletim Sistemleri, s. 26Sanal bellek, her process'e kendine ait özel bir adres alanı veren ve bunu arka planda fiziksel RAM'e ya da diske eşleyen bir işletim sistemi tekniğidir.
- HeapVeri Yapıları, s. 19Heap, en küçük ya da en büyük öğeyi kökünde tutan ağaç tabanlı bir veri yapısıdır; bu öğeyi O(1)'de okuyabilir ve O(log n)'de çıkarabilirsiniz.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin