Garbage Collection در JavaScript: راهنمای کامل
JavaScript یکی از زبانهایی است که مدیریت حافظه را بهصورت خودکار انجام میدهد. این ویژگی، کار توسعهدهندگان را سادهتر میکند اما باعث نمیشود که نگرانی در مورد حافظه از بین برود. اگر یک برنامه JavaScript بهدرستی مدیریت نشود، Memory Leakها یا کند شدن برنامه کاملاً ممکن است.
در این راهنمای جامع، مکانیزم Garbage Collection (GC) در JavaScript را از صفر تا صد بررسی میکنیم.
بخش 1 — حافظه در JavaScript چگونه کار میکند؟
تخصیص حافظه (Memory Allocation)
وقتی یک متغیر، آبجکت، آرایه یا تابع ایجاد میکنید، JavaScript باید جایی در حافظه برای آن رزرو کند:
let user = { name: "Parsa" };
در این لحظه:
- یک آبجکت در Heap ساخته میشود
- یک رفرنس به این آبجکت در Stack ذخیره میشود
وقتی دادهها را بخوانید، مقدار جدید بدهید یا یک متد فراخوانی کنید، JavaScript با داده در حافظه تعامل دارد.
وقتی دادهای دیگر استفاده نمیشود، باید از حافظه حذف شود.
اینجا Garbage Collector وارد عمل میشود.
بخش 2 — چرا به Garbage Collection نیاز داریم؟
در زبانهایی مثل C یا C++، برنامهنویس باید حافظه را دستی آزاد کند.
اما در JavaScript:
- این کار خودکار است
- موتور JavaScript تشخیص میدهد چه دادهای «دیگر لازم نیست»
- سپس آن را از حافظه حذف میکند
این حذف خودکار باعث جلوگیری از:
- انباشته شدن حافظه
- کند شدن مرورگر
- Memory Leak
- Crash شدن اپلیکیشن
میشود.
آیا میدانید مدرسه فرانت اند پرنیان، دوره آموزش فرانت اند از صفر تا صد را بصورت حرفه ای برگزار میکند؟
بخش 3 — ساختار حافظه در JavaScript
JavaScript از دو بخش اصلی حافظه استفاده میکند:
3.1 Stack
برای دادههای ساده و سریع:
- Number
- Boolean
- Null
- Undefined
- Reference به یک Object
3.2 Heap
برای ساختارهای پیچیده:
- Object
- Array
- Function
- Class Instance
دلیل وجود Heap: اندازه و ساختار آبجکتها قابل پیشبینی نیست.
پیشنهاد میشود از مقاله حافظه هیپ و استک هم مطالعه بفرمایید.
بخش 4 — Garbage Collection چگونه کار میکند؟
JavaScript از الگوریتمهای مختلف GC استفاده میکند اما اصلیترین الگوریتم آن:
4.1 الگوریتم Reachability (قابلیت دستیابی)
این قانون ساده اما بسیار قدرتمند است:
«هر دادهای که قابلیت دسترسی داشته باشد، زنده است؛ هر دادهای که غیرقابل دسترسی باشد، حذف میشود.»
ریشههای قابل دسترس (Roots):
- Global Object (مثل window یا globalThis)
- متغیرهای global
- Closure ها
- Stack frames فعال
مثال:
let person = { name: "Parsa" };
person = null;
وقتی رفرنس حذف شود، آبجکت دیگر reachable نیست → GC آن را پاک میکند.
بخش 5 — الگوریتم Mark-and-Sweep
این معروفترین روش Garbage Collection است.
5.1 مرحله Mark
GC تمام دادههایی که قابل دسترسی هستند را علامتگذاری میکند.
5.2 مرحله Sweep
GC دادههای علامتگذاری نشده را حذف میکند.
نتیجه: حافظه آزاد میشود.
آیا میدانید مدرسه فرانت اند پرنیان، کلاس فرانت اند از صفر تا صد را بصورت حرفه ای برگزار میکند؟
بخش 6 — Memory Leak در JavaScript
Memory Leak یعنی دادهای در حافظه میماند ولی دیگر استفاده نمیشود.
6.1 حالتهای رایج Memory Leak
1) متغیرهای Global بیدلیل
leaked = "oops";
2) تایمرهای پاک نشده
setInterval(() => {}, 1000); // اگر clearInterval نشود → Memory Leak
3) رویدادهای ثبتشده بدون removeEventListener
4) کلوزرهای غیرضروری که متغیرهای سنگین را نگه میدارند
5) نگهداری آبجکتهای بزرگ در Cache
حافظه به دو نسل تقسیم میشود:
Young Generation (نسل جوان)
- دادههای جدید
- آزادسازی سریع
- GC سبک و سریع
Old Generation (نسل قدیمی)
- دادههایی که مدت طولانی در حافظه ماندهاند
- نیازمند GC سنگینتر
ایده: بیشتر آبجکتها عمر کوتاه دارند → سریع پاک میشوند.
Garbage Collection در JavaScript یکی از مهمترین بخشهای داخلی زبان است که سرعت، کارایی و پایداری اپلیکیشنها را تضمین میکند. دانستن نحوه کار GC، تشخیص Memory Leak و پیادهسازی Best Practiceها باعث میشود برنامههای جاوااسکریپت شما:
- سریعتر
- سبکتر
- پایدارتر
- و حرفهایتر
اجرا شوند.
اگر پروژههای بزرگ React، Next.js، Vue یا Node.js دارید، مدیریت حافظه یکی از مهارتهای ضروری است.
امیدواریم از این مقاله نهایت استفاده را برده باشید و آن را با دوستانتان به اشتراک بگذارید. تیم تولید محتوای مدرسه اینترنتی پرنیان این مقاله را تهیه کرده است.
درباره مدیریت
شما در حال مطالعه یکی از مقالات آموزشی وبلاگ پرنیان بودید. اگر برایتان مفید بود آن را با دوستانتان به اشتراک بگذارید. من پارسا قربانیان و اینجا مدرسه فرانت اند پرنیان، میخواهیم در یک معامله برد برد، با هم به آرزوهایمان برسیم..
نوشته های بیشتر از مدیریت1 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
عالی بود ممنون از شما
مرسی که کامل این موضوع را توضیح دادین
با قدرت ادامه بدین