Q49. What is garbage collection in JavaScript and how does memory management work?
না ব্যবহৃত মেমোরি কীভাবে স্বয়ংক্রিয়ভাবে মুক্ত হয়, reachability-এর ধারণা।
JavaScript-এ garbage collector (GC) স্বয়ংক্রিয়ভাবে সেই মেমোরি ফেরত নেয় যা আর কোনো কোডের কাজে লাগছে না। আপনাকে মেমোরি নিজে থেকে ছাড়তে হয় না, তবে কীভাবে এটি কাজ করে বোঝলে অনেক সমস্যা এড়ানো যায়।
মূল নিয়মটি হলো reachability — যে কোনো মান পুরো অবস্থায় root থেকে পৌঁছানো যায় না, সেটাই আর দরকার নেই এবং সংগ্রহ করা হয়।
let user = { name: "Rahim" }; // এখন root থেকে পৌঁছানো যায়
user = null;
// এখন কোনো reference নেই, তাই GC এই object মুক্ত করতে পারে
// কিন্তু reference থাকলে মুক্ত হবে না
let cache = { data: [1, 2, 3] };
console.log(cache.data.length); // পড়া হলেও reference মুছে যায় নাধাপে ধাপে — প্রথমে user variable-এ reference থাকায় object সফলভাবে চলছে। user = null করলে reference ভেঙে যায়, ফলে সেই object আর root থেকে পৌঁছানো যায় না এবং GC তাকে মুক্ত করে। কিন্তু cache-এর reference যতক্ষণ আছে, ততক্ষণ সেটিও মুক্ত হবে না।
GC সাধারণত mark and sweep ভাবে কাজ করে — প্রথমে পৌঁছানো যায় এমন সব মান mark করে, তারপর যেগুলো mark হয়নি সেগুলো sweep করে মুক্ত করে।
function createUser() {
return { name: "Rahim", data: new Array(1000000) };
}
let result = createUser();
result = null;
// কোথাও reference নেই, তাই এই বড় object কিছুক্ষণ পরেই মুক্ত হবেconst ব্যবহার করলেও object-ই mutable থাকে — const শুধু reference বদলাতে বাঁধে, তাই reference বদলে ফেললে সেই object-ও মুক্ত হয়ে যায়।
// ❌ দীর্ঘস্থায়ী reference থাকলে GC হবে না
let handlers = [];
function setup() {
const bigData = new Array(1000000).fill(0);
handlers.push(() => bigData.length);
// handlers খালি না হলে bigData মেমোরিতে থেকে যাবে
}
// ✅ যখন দরকার নেই তখন মুছে দিন
handlers.length = 0;// পুরোনো browser-এ WeakMap ছিল একমাত্র উপায়
// এখন WeakRef ও FinalizationRegistry আছে (ES2021)
let heavy = { data: new Array(1000000) };
const ref = new WeakRef(heavy);
heavy = null; // reference ভাঙলাম
// পরে যখন GC চায় তখনই ফেরত আসবে
const collected = ref.deref();
console.log(collected); // object অথবা undefinedWeakMap আর WeakSet-এর key হিসেবে object রাখলে সেই object আর অন্য কোথাও reference না থাকলেও GC হতে পারে — এভাবে cache বানালে memory leak টানা যায় না।
// Map-এ cache রাখলে key object আটকে যায়
const cache = new Map();
const key = { id: 1 };
cache.set(key, "তথ্য");
// key = null করলেও cache-এ reference থাকায় মেমোরি মুক্ত হবে না
// ✅ WeakMap ব্যবহার করলে সমস্যা নেই
const weakCache = new WeakMap();
weakCache.set(key, "তথ্য");
key = null; // এখন মেমোরি ফেরত দেওয়া সম্ভবStack ও Heap-এর পার্থক্য মনে রাখা দরকার — primitive মান (number, string, boolean) stack-এ থাকে, আর object, array, function সবসময় heap-এ। তাই reference-ভিত্তিক মেমোরি ম্যানেজমেন্ট মূলত heap নিয়েই কাজ করে।
| বিষয় | বিবরণ |
|---|---|
| কে মেমোরি ফেরত দেয় | GC (engine নিজে) |
| মূল নিয়ম | reference না থাকলেই মুক্ত হয় |
| কৌশল | mark and sweep |
| চালু করা যায় | globalThis.gc() — শুধু Node flag দিয়ে |
| নিয়ন্ত্রণ | মূলত সম্ভব নয়, কোড লিখেই ঠিক করতে হয় |
ব্রাউজারে GC চালানোর সাধারণ কোনো উপায় নেই, তাই মেমোরি অনেক বেড়ে গেলে WeakRef বা WeakMap ব্যবহার করা ভালো। Node.js-এ --expose-gc ফ্ল্যাগ দিলে শুধু debug করার সময় globalThis.gc() ডেকে মেমোরি তাড়াতাড়ি মুক্ত করা যায়।