কিছু ভাষার মতো না, JavaScript-এ কখনো হাতে memory free করার দরকার হয় না — একটি garbage collector স্বয়ংক্রিয়ভাবে এটা করে। এটা কী free করবে মোটামুটি কীভাবে ঠিক করে তা বোঝা বেশিরভাগ real-world memory leak ব্যাখ্যা করে।
| ধাপ | কী ঘটে |
|---|---|
| Allocate | একটি মান তৈরি হলে memory সংরক্ষিত হয় — একটি variable, একটি object, একটি function |
| Use | Program সেই memory পড়ে আর লেখে |
| Release | কিছু আর এটা পৌঁছাতে না পারলে garbage collector memory free করে |
একটি object memory-তে থাকে যতক্ষণ এটা reachable — একটি "root" (global variable, বর্তমান call stack) থেকে সরাসরি বা পরোক্ষভাবে reachable। কিছু আর একটি object reference না করা মাত্র, এটা collection-এর যোগ্য হয়ে যায়।
let user = { name: 'Sam' } // object 'user'-এর মাধ্যমে reachable
user = null // কিছুই আর object-টা reference করে না —
// garbage collection-এর যোগ্যএকটি চলমান setInterval স্পষ্টভাবে clear না করা পর্যন্ত এর callback reference করা সবকিছুকে অনির্দিষ্টকালের জন্য reachable রাখে — এটা তৈরি করা কোড অনেক আগে চলে গেলেও।
// LEAK — এই interval, আর এটা close over করা সবকিছু, কখনো free হয় না
function startPolling() {
const data = fetchLargeDataset()
setInterval(() => {
console.log(data.length)
}, 1000)
}
// FIXED — interval ID সংরক্ষণ করুন আর আর দরকার না হলে clear করুন
function startPolling() {
const data = fetchLargeDataset()
const intervalId = setInterval(() => {
console.log(data.length)
}, 1000)
return () => clearInterval(intervalId)
}কোথাও একটি variable এখনো এটা reference করলে একটি সরানো DOM element এখনো garbage collected হতে পারে না।
let cachedButton = document.querySelector('#submit')
cachedButton.remove() // পেজ থেকে সরানো, কিন্তু free না —
// cachedButton এখনো এটা reference করে
cachedButton = null // এখন এটা আসলে collect করা যায়element.addEventListener('click', handleClick)
// element DOM থেকে সরানো হলে এটাও call না করে:
element.removeEventListener('click', handleClick)
// listener (আর handleClick close over করা যেকোনো কিছু) memory-তে থেকে যেতে পারেবাস্তবে একটি leak check করা
Browser DevTools-এর Memory tab একটি heap snapshot নিতে পারে আর সময়ের সাথে তুলনা করতে পারে — snapshot-এর মধ্যে detached DOM node-এর বাড়তে থাকা সংখ্যা একটি আসল leak-এর সবচেয়ে স্পষ্ট practical চিহ্ন।