Heap — dastur ishlash vaqtida dinamik xotira ajratish uchun foydalanadigan memory region. Object yoki buffer hajmi compile vaqtida noma’lum bo‘lsa, allocator heap’dan joy beradi.
C tilida malloc, C++da new, ko‘plab yuqori darajali tillarda object yaratish heap allocationga olib kelishi mumkin.
Heap data strukturadagi binary heap bilan bir xil tushuncha emas.
Dynamic allocation
Dastur xotira so‘raydi:
allocator → kerakli hajmdagi blok
Blok pointer yoki reference orqali ishlatiladi.
Keyin:
- qo‘lda bo‘shatiladi;
- garbage collector tomonidan yig‘iladi;
- process tugaganda OS tomonidan qaytariladi.
Heap va stack
| Jihat | Heap | Stack |
|---|---|---|
| Allocation | Dynamic | Function call bilan avtomatik |
| Umri | Explicit yoki GCga bog‘liq | Scope/call tugaguncha |
| Hajm | Katta va moslashuvchan | Thread limitiga bog‘liq |
| Tezlik | Allocator ishlovi kerak | Stack pointer o‘zgaradi |
| Fragmentatsiya | Bo‘lishi mumkin | Kamroq |
| Sharing | Threadlar umumiy | Har threadda alohida |
Barcha local object stackda, barcha object heapda degan qoida har til va compilerda bir xil emas.
Allocator
Allocator katta memory regionlarni operatsion tizimdan oladi va kichik bloklarga bo‘ladi.
Vazifalari:
- mos bo‘sh blok topish;
- alignment;
- metadata;
- bo‘shatish;
- bloklarni birlashtirish;
- thread contentionni kamaytirish;
- xavfsizlik tekshiruvi.
Keng tarqalgan allocatorlar turli strategiyadan foydalanadi.
Operatsion tizimdan xotira olish
Allocator xotirani:
brkyokisbrktarixan;mmap;- virtual memory API
orqali olishi mumkin.
Katta allocation alohida mapping sifatida yaratilishi mumkin.
free() qilingan memory har doim darhol OSga qaytmaydi. Allocator keyingi so‘rov uchun saqlab qoladi.
Allocation metadata
Har blok yonida yoki alohida strukturada:
- hajm;
- holat;
- oldingi/keyingi bo‘sh blok;
- arena;
- checksum yoki guard
saqlanishi mumkin.
Buffer overflow metadata’ni buzsa, keyingi free yoki allocation paytida crash yuz beradi.
Alignment
CPU va SIMD instructionlar ma’lumotning ma’lum chegaraga tekislanishini talab qilishi yoki undan foyda ko‘rishi mumkin.
Allocator odatda umumiy alignment kafolatlaydi.
Maxsus:
- aligned allocation;
- page alignment;
- cache-line alignment
APIlari mavjud.
Free list
Bo‘sh bloklar hajm yoki joylashuv bo‘yicha ro‘yxatlarda saqlanadi.
Allocation algoritmlari:
- first fit;
- best fit;
- segregated bins;
- buddy;
- slab;
- arena.
Har birining tezlik va fragmentation xususiyati farq qiladi.
Internal fragmentation
Ajratilgan blok so‘ralgan hajmdan kattaroq.
Masalan, 33 bayt so‘rov 48 bayt size class oladi.
Ortiqcha qism internal fragmentation.
Alignment va metadata ham overhead qo‘shadi.
External fragmentation
Bo‘sh xotira umumiy hajmda yetarli, lekin kichik tarqoq bloklarga bo‘lingan.
Katta contiguous block topilmaydi.
Bloklarni birlashtirish va size class strategiyasi yordam beradi.
Virtual memory fizik contiguous xotira talabini kamaytiradi, lekin allocator virtual region ichida fragmentatsiyaga ega bo‘lishi mumkin.
Memory leak
Dastur heap blockga reference’ni yo‘qotadi, ammo uni bo‘shatmaydi.
Process ishlash davomida xotira sarfi o‘sadi.
Leak manbalari:
- missing
free; - global cache;
- listener olib tashlanmagan;
- reference cycle;
- queue;
- thread-local;
- native extension.
Garbage collector barcha leakni yo‘q qilmaydi. Keraksiz objectga reference qolsa, u yig‘ilmaydi.
Dangling pointer
Blok bo‘shatilgan, ammo pointer saqlanib qolgan.
Undan foydalanish use-after-free hisoblanadi.
Blok boshqa object uchun qayta ishlatilishi mumkin.
Pointer’ni NULL qilish barcha aliaslarni avtomatik tozalamaydi.
Double free
Bir blok ikki marta allocatorga qaytariladi.
Bu free list va metadata’ni buzishi mumkin.
Zamonaviy allocator ayrim double free’ni aniqlab processni to‘xtatadi.
Buffer overflow
Ajratilgan blok chegarasidan tashqariga yozish qo‘shni object yoki metadata’ni buzadi.
Misol:
10 bayt ajratildi
20 bayt yozildi
Natija darhol emas, keyingi allocation yoki free paytida ko‘rinishi mumkin.
Heap corruption
Belgilar:
- allocator assertion;
- random crash;
- invalid free;
- corrupted size;
- unrelated joyda segmentation fault.
Asl xato crashdan ancha oldin sodir bo‘lgan bo‘lishi mumkin.
Sanitizer va deterministic test yordam beradi.
Thread safety
Ko‘p thread bir allocator’dan foydalanadi.
Global lock contentionni kamaytirish uchun:
ishlatiladi.
Bir thread ajratgan blokni boshqasi bo‘shatishi mumkin, ammo allocator semantikasi bunga mos bo‘lishi kerak.
Arena
Allocator heapni bir nechta arena’ga bo‘lishi mumkin.
Threadlar turli arena bilan parallel ishlaydi.
Ko‘p arena memory footprint va fragmentationni oshirishi mumkin.
Container memory limitida allocator defaultlari moslashtiriladi.
Garbage collection
Managed runtime heap objectlarini avtomatik boshqaradi.
GC usullari:
- reference counting;
- mark-and-sweep;
- generational;
- copying;
- compacting;
- concurrent;
- incremental.
GC memory safetyni yaxshilaydi, ammo pause va overheadga ega.
Generational heap
Ko‘p object qisqa umr ko‘radi degan kuzatuvga tayanadi.
Heap:
- young generation;
- old generation
ga bo‘linadi.
Young collection tez-tez, old collection kamroq bajariladi.
Uzoq yashaydigan object promote qilinadi.
Compacting
GC tirik objectlarni bir joyga ko‘chirib, bo‘sh hududni birlashtiradi.
Bu external fragmentationni kamaytiradi.
Pointerlar runtime tomonidan yangilanadi. Native raw pointerlar maxsus handle talab qilishi mumkin.
Heap growth
Process RSS va virtual memory bir xil emas.
Allocator katta virtual region rezerv qilib, faqat ishlatilgan sahifalarni RAMga olib kelishi mumkin.
free() qilingan blok allocator ichida qolsa, RSS darhol kamaymaydi.
Bu har doim leak degani emas.
Memory limit
Container yoki service memory limitga ega bo‘lishi mumkin.
Heap limitdan oshsa:
- allocation failure;
- runtime out-of-memory;
- GCning ko‘payishi;
- kernel OOM kill
yuz beradi.
Application heap metriği bilan process RSS birga kuzatiladi.
Profiling
Heap profiler:
- qaysi call site allocation qiladi;
- object soni;
- retained size;
- allocation rate;
- leak;
- fragmentation
ni ko‘rsatadi.
Snapshotlar vaqt bo‘yicha solishtiriladi.
Faqat eng katta object emas, uni ushlab turgan reference chain muhim.
Xavfsizlik
Heap exploitationga qarshi allocator:
- randomization;
- guard;
- quarantine;
- metadata check;
- safe unlink;
- pointer encoding;
- zeroing
kabi himoya ishlatishi mumkin.
Memory-safe til va process sandbox qo‘shimcha himoya beradi.
Diagnostika
Heap muammosida:
- allocation rate;
- live object;
- RSS;
- virtual size;
- GC pause;
- fragmentation;
- double free;
- use-after-free;
- sanitizer;
- heap snapshot;
- OOM log
tekshiriladi.
Xotira o‘sishi leak, cache, allocator retention yoki normal workload sabab bo‘lishi mumkin. Ular alohida ajratiladi.
Bog‘liq tushunchalar
Dynamic memory, Allocator, Stack, Memory leak, Fragmentation, Garbage collection, Use-after-free, Double free, OOM, Heap profiler