Bosh sahifa Wiki Memory leak

Memory leak

Memory leak — dastur endi kerak bo‘lmagan xotirani bo‘shatmay yoki unga keraksiz havolani saqlab qolib, xotira sarfining vaqt o‘tishi bilan ortib borishiga sabab bo‘ladigan holatdir. Leak darhol xato bermasligi mumkin. Uzoq ishlaydigan jarayonda RAM bosimi oshadi, garbage collection tezlashadi, tizim swapdan foydalanadi yoki jarayon xotira yetishmasligi sabab to‘xtatiladi.

Manual xotira boshqaruvi

C va C++ kabi tillarda dasturchi dinamik xotirani ajratish va bo‘shatishni boshqaradi. malloc bilan olingan blokka barcha pointerlar yo‘qolsa, blok ishlatilmaydi, ammo free qilinmagani uchun allocator uni qayta bera olmaydi. Erta return, exception yoki murakkab ownership yo‘li bo‘shatishni o‘tkazib yuborishi mumkin.

RAII yondashuvida resurs obyekt hayot sikliga bog‘lanadi. C++ smart pointerlari ownershipni ifodalaydi, lekin ikki shared_ptr bir-biriga havola qilsa reference cycle hosil bo‘lishi mumkin. Bunday bog‘lanishning bir tomoni weak_ptr bilan ifodalanadi.

Garbage collection mavjud tillar

Garbage collector yetib bo‘lmaydigan obyektlarni avtomatik tozalaydi, ammo dastur keraksiz obyektga hali ham reachable havola saqlasa, collector uni tirik deb hisoblaydi. Global kolleksiyaga doim element qo‘shish, event listenerni olib tashlamaslik, cheksiz cache yoki yopilmagan subscription shunday leak keltiradi.

Closure katta obyektni bevosita ishlatmasa ham tashqi scope orqali ushlab turishi mumkin. DOM element sahifadan olib tashlangan, lekin JavaScript listener yoki boshqa obyekt unga havola qilayotgan bo‘lsa, detached node xotirada qoladi.

Belgilari

Leakni oddiy yuqori xotira sarfidan farqlash kerak. Dastur katta datasetni qayta ishlayotgan paytda xotira oshishi kutilgan xulq bo‘lishi mumkin. Leakda bir xil ish sikllari tugagach ham baseline xotira qaytmaydi va uzoq testda o‘sish davom etadi.

RSS jarayon egallagan resident sahifalarni, heap profiler esa ajratilgan obyekt va stacklarni ko‘rsatadi. Allocator bo‘shatilgan xotirani operatsion tizimga darhol qaytarmasligi mumkin; shu sababli faqat RSS grafik leakni isbotlamaydi.

Aniqlash usullari

Heap snapshotlar ikki vaqt nuqtasidagi obyektlar soni va retained size farqini ko‘rsatadi. Allocation profiler qaysi call stack ko‘p xotira ajratganini aniqlaydi. C/C++ muhitida Valgrind, AddressSanitizer yoki LeakSanitizer yo‘qolgan allocationlarni topishi mumkin. Reproduksiya testi bir xil operatsiyani ko‘p marta bajarib, har sikldan keyingi xotira holatini o‘lchaydi.

Resurs leaklari

File descriptor, socket, database connection yoki GPU buffer ham yopilmay qolishi mumkin. Bu har doim heap memory leak bo‘lmasa-da, cheklangan resurs tugashiga olib keladi. finally, context manager va aniq lifecycle resursni muvaffaqiyat hamda xato yo‘lida bir xil yopishga xizmat qiladi.

Cache va leak farqi

Cache xotirani ataylab ushlab turadi va qayta hisoblashni kamaytiradi. U cheklovsiz o‘ssa, amaliy jihatdan leakka o‘xshash resurs tugashiga olib keladi. Sog‘lom cache maksimal element yoki byte limiti, eviction siyosati va kuzatuv metrikasiga ega. LRU yaqinda ishlatilmagan yozuvni, TTL esa vaqti tugagan yozuvni chiqaradi. Faqat TTL qo‘yish trafik tezligi juda yuqori bo‘lsa bir vaqtning o‘zida katta to‘plamni ushlab turishi mumkin. Heap snapshotda cache obyektlari reachable ko‘rinadi; ularni “collector xatosi” deb emas, retention siyosati bo‘yicha tahlil qilish kerak.

Leak tuzatilgach, uzoq davom etuvchi regression test xotira baselinei barqaror qolishini tekshiradi va shu muammoning keyingi versiyada qaytishini aniqlaydi.

Bog‘liq tushunchalar

heap, garbage collection, pointer, reference cycle, profiler, RAII, resource leak