JavaScript xotira sikli, Reachability (yetib bo'lish) tamoyili, Root obyektlar, Memory Leak (xotira sizishi) sabablari: global o'zgaruvchilar, to'xtatilmagan taymerlar va yechimlar.
Bu bobda JavaScript engine xotirani qanday boshqarishini, va nega ba'zida dasturlar "xotira sizib chiqishi" (memory leak)ga duch kelishini o'rganamiz.
Har qanday dasturlash tilida, xotira odatda 3 bosqichdan o'tadi:
Ko'p tillardan (masalan, C++) farqli, JavaScript'da dasturchi xotirani qo'lda ozod qilishi shart emas — buni Garbage Collector (GC) avtomatik bajaradi.
script.jsJavaScriptlet user = { name: "Ali" }; // xotira ajratiladiuser = null; // endi "Ali" object'iga hech kim ishora qilmaydi// Garbage Collector uni keyinroq avtomatik "tozalaydi"
Garbage Collector — "bu obyekt kerakmi yoki yo'qmi"ni Reachability (yetib bo'lish) tamoyili orqali aniqlaydi: agar biror obyektga hech qanday yo'l bilan yetib bo'lmasa (unga hech qanday havola qolmasa), u "chiqindi" (garbage) hisoblanadi va tozalanadi.
🏝️ Reachability'ni orolga o'xshating: agar biror oroldan (root — asosiy dastur) hech qanday ko'prik yoki yo'l orqali boshqa bir oroliga (obyekt) yetib bo'lmasa, o'sha orol "yo'qolgan" hisoblanadi, garchi u jismonan hali mavjud bo'lsa ham.
Har doim "yetib bo'ladigan" hisoblanadigan asosiy obyektlar:
code.textTEXT[Root: global scope]│├──▶ user ──▶ { name: "Ali" } ← yetib bo'ladi, TIRIK│└──▶ oldUser = null ← endi hech kimga yo'l yo'q│▼{ name: "Vali" } ← YETIB BO'LMAYDI, GC TOZALAYDI
💡 Key Idea
Garbage Collector — "bu obyekt ishlatilyaptimi" deb emas, "bu obyektga hali ham yo'l bormi" deb so'raydi. Agar yo'l bo'lmasa (reachable emas), obyekt — chiqindi.
Memory Leak — dastur endi kerak bo'lmagan obyektga tasodifan hali ham havola saqlab qolishi, natijada Garbage Collector uni "tirik" deb hisoblab, tozalay olmasligi.
Agar dastur uzoq vaqt (masalan, bir necha soat) ishlasa va har safar kichik-kichik "sizib chiqishlar" to'planib borsa, oxir-oqibat dastur juda ko'p xotira egallab, sekinlashishi yoki hatto "yiqilishi" (crash) mumkin.
script.jsJavaScriptfunction createGlobalLeak() {accidentalGlobal = "Men global bo'lib qoldim"; // 'let'/'var' yozilmagan!}createGlobalLeak();
Explanation
let/const/var yozilmasdan variable'ga qiymat berilsa, JavaScript uni avtomatik ravishda global qiladi (strict mode'da bo'lmasa). Bu — function tugagandan keyin ham, o'sha ma'lumot hech qachon tozalanmasligini anglatadi, chunki global scope — har doim "root" dan yetib bo'ladi.
⚠️ Common Mistake
Chapter 11'da o'rgangan qoidani eslash muhim: har doim let/const bilan variable e'lon qiling. Bu — nafaqat Scope tushunchasi uchun, balki xotira boshqaruvi uchun ham muhim.
script.jsJavaScriptfunction startTracking(element) {setInterval(function () {console.log(element.innerHTML); // element'ga doimiy havola saqlanadi}, 1000);}let box = document.getElementById("box");startTracking(box);box = null; // dasturchi "box"ni tozalamoqchi, lekin...// setInterval ICHIDAGI closure hali ham 'element'ga (asl box'ga) ishora qilib turibdi!
Explanation
Bu — Chapter 30'da o'rgangan setIntervalning yashirin xavfi: agar clearInterval() chaqirilmasa, timer abadiy ishlayveradi, va uning ichidagi closure (Chapter 12) orqali ushlab turilgan element obyekti ham hech qachon Garbage Collector tomonidan tozalanmaydi — garchi tashqi box variable'i null qilingan bo'lsa ham.
🔗 Connection
Bu — Chapter 30.2'dagi "setIntervalni to'xtatishni unutish" ogohlantirishining, endi xotira nuqtai nazaridan tushuntirilishi.
script.jsJavaScriptfunction attachHandler() {let largeData = new Array(1000000).fill("ma'lumot");document.getElementById("btn").addEventListener("click", function () {console.log(largeData.length); // largeData'ga doimiy havola});}attachHandler();
Explanation
Event listener ichidagi closure — largeDataga (juda katta array) doimiy ravishda ishora qilib turadi. Agar bu tugma DOM'dan o'chirilsa ham (element.remove() — Chapter 32), lekin listener avval removeEventListener orqali olib tashlanmasa, ba'zi hollarda largeData xotirada "tirik" qolib ketishi mumkin.
| Muammo | Yechim |
|---|---|
| Unutilgan global variable'lar | Har doim let/const ishlatish |
To'xtatilmagan setInterval | Kerak bo'lmaganda clearInterval() chaqirish |
| Olib tashlanmagan event listener'lar | Element kerak bo'lmay qolganda removeEventListener() chaqirish |
| Katta ma'lumotni keraksiz uzoq saqlash | Foydalanib bo'lgach, null qilib "bo'shatish" |
script.jsJavaScriptclass Timer {constructor() {this.intervalId = null;}start() {this.intervalId = setInterval(() => {console.log("Ishlayapti...");}, 1000);}stop() {if (this.intervalId) {clearInterval(this.intervalId);this.intervalId = null;}}}let timer = new Timer();timer.start();// Kerak bo'lmay qolganda:timer.stop(); // xotira to'g'ri "bo'shatiladi"
🔥 Important
Har safar setInterval, addEventListener, yoki uzoq muddatli obuna (Chapter 42'dagi Observer Pattern) yaratganda, doim "buni qanday va qachon to'xtataman/tozalayman?" deb o'ylab qo'yish — professional dasturlashning muhim odati hisoblanadi.
Task:
Quyidagi kodda potentsial xotira muammosini toping va tushuntiring:
script.jsJavaScriptfunction saveData() {globalData = { info: "muhim ma'lumot" };}
Required Concepts:
let/const yozilganmi yoki yo'qmi, diqqat bilan qarang.Task:
Timer class yozing (Chapter 43.4'dagi kabi), start() va stop() metodlari bilan. stop() chaqirilmasdan oldin va keyin intervalIdning holatini tekshirib ko'ring.
Required Concepts:
clearIntervalTask:
EventManager class yarating — addListener(element, event, callback) metodi listener'ni qo'shadi va uni ichki array'da "eslab qoladi" ({element, event, callback} shaklida). removeAllListeners() metodi — barcha saqlangan listener'larni removeEventListener orqali to'g'ri olib tashlasin.
Required Concepts:
addEventListener/removeEventListener (Chapter 33)addListener chaqiruvida, {element, event, callback} object'ini ichki array'ga push qiling.script.jsJavaScriptfunction createUser() {let user = { name: "Ali" };return user;}let user1 = createUser();let user2 = user1;user1 = null;console.log(user2.name);
🧠 Think first! Javobni ko'rishdan oldin kamida 30 soniya o'ylang.
<details> <summary>Answer</summary> "Ali"Why?
user1 = null — faqat user1 variable'ining { name: "Ali" } obyektiga bo'lgan havolasini olib tashlaydi. Lekin user2 hali ham o'zining havolasi orqali o'sha obyektga "yetib boradi" (reachable). Shuning uchun Garbage Collector obyektni tozalamaydi, va user2.name hamon "Ali"ni qaytaradi.
Quyidagi kodda xotira sizib chiqishi (memory leak) bor:
script.jsJavaScriptlet cache = {};function processRequest(id, data) {cache[id] = data; // har bir so'rov natijasi CHEKSIZ saqlanmoqdareturn data;}for (let i = 0; i < 100000; i++) {processRequest(i, { largeInfo: "..." });}
Your Task:
Yechim — cache hajmini cheklash:
</details>script.jsJavaScriptlet cache = {};const MAX_CACHE_SIZE = 100;function processRequest(id, data) {let keys = Object.keys(cache);if (keys.length >= MAX_CACHE_SIZE) {delete cache[keys[0]]; // eng eskisini o'chirish}cache[id] = data;return data;}
let/const ishlatish — tasodifiy global variable yaratilishining, demak memory leak'ning oldini oladi.setInterval yoki uzoq muddatli obuna uchun, uni to'xtatish mexanizmini oldindan rejalashtiring.script.jsJavaScript// Yaxshi amaliyotlar:let value = 10; // hech qachon let/const'siz yozmanglet id = setInterval(fn, 1000);clearInterval(id); // kerak bo'lmaganda albatta to'xtatingelement.addEventListener("click", handler);element.removeEventListener("click", handler); // kerak bo'lmaganda olib tashlanglet bigData = loadData();// ishlatilgach:bigData = null; // GC'ga signal beradi
Mavzu bo‘yicha tushunchalaringizni interaktiv test orqali sinovdan o‘tkazing va natijalarni bilib oling.
Darslikda o‘rganilgan qoidalarga asosan real kod yozing, testlardan o‘tkazing va yechimlarni mustahkamlang.
Test Sinovi
Hali topshirilmagan (kamida 75% kerak)
Amaliy Masalalar
0 / 3 ta yechildi (kamida 75% kerak)
Dars sifati va mazmunini yaxshilash uchun o‘z haqqoniy bahoingizni qoldiring.
Mavzuni to‘liq o‘zlashtirish uchun test sinovi, amaliy kodlash va bog‘liq darslar
O‘z bilimingizni interaktiv test savollari orqali tekshiring va darhol xatolarni tahlil qiling.
Nazariyani real kod yozish bilan mustahkamlang, avtomatik testlardan o‘ting va XP to‘plang.
Kurs bo‘yicha keyingi va bog‘liq mavzular: