Garbage collection – مدیریت حافظه در جاوا اسکریپت
آنچه خواهید دید :
ToggleGrabage collection در جاوا اسکریپت
در جاوا اسکریپت مقداری حافظه اختصاص داده شده و همانند هر زبان دیگری برای هر متغییر حافظه ای اختصاص داده میشود و مدیریت حافظه در جاوا اسکریپت به صورت خودکار و پنهان انجام می شود. قدرتمندترین ابزاری که در جاوا اسکریپت حافظه را مدیریت میکند Garbage collection است.
الگوریتمی است در engine جاوا اسکریپت که میاد و تمامی متغیر های قدیمی و بلا استفاده ای که قبلا وجود داشته را حذف میکند و دیگر لازم نیست که بصورت دستی اینکار را انجام دهیم.
درک مدیریت حافظه در جاوا اسکریپت حول مفهوم دسترس پذیری می چرخد. اشیایی که از شی عمومی یا دیگر اشیاء ریشه دار قابل دسترسی هستند، در دسترس در نظر گرفته می شوند. به این معنی که به طور فعال توسط برنامه مورد استفاده قرار می گیرند. اشیایی که از هیچ شی ریشه ای قابل دسترسی نیستند بلا استفاده در نظر گرفته می شوند.
الگوریتم های استفاده شده در Garbage collection
در جاوا اسکریپت، این مبحث توسط 2 الگوریتم حافظه را مدیریت میکند.
- الگوریتم رفرنس شماری (Reference-counting)
- الگوریتم نشان و گردش (Mark-and-sweep algorithm)
الگوریتم رفرنس شماری (Reference-counting)
در الگوریتم Reference-counting متغیر هایی که هیچ اشاره ای به آن ها در حافظه نشده است را پیدا می کند و آن ها را حذف می کند.
مثالی ساده از الگوریتم Reference-counting
let programmer = { name: "farhad", };
در این مثال متغیر programmer به شی {“name : “farhad}اشاره دارد، پس رفرنسی به این شی داده شده و از حافظه پاک نمی شود. حال اگر بیایم و مقدار این متغیر را تغییر دهیم
let programmer = { name : "farhad" }; programmer = null
حال که مقدار متغیر programmer را تغییر دادیم، هیچ اشاره ایی به {“name : “farhad} نشده پس این یک ابجکت بلا استفاده است و هیچ رفرنسی به آن داده نشده است و توسط این الگوریتم حذف می شود.
الگوریتم نشان و گردش (Mark-and-sweep algorithm)
در الگوریتم Mark-and-sweep از اشیاء عمومی شروع به پیمایش میکند، هر شی ای که به آن اشاره شده است را پیدا می کند و آن ها را به خاطر می سپارد که دوباره از آن ها بازدید نکند، سپس آن ها را علامت گذاری می کند و این فرایند تا زمانی که از تمام شی های قابل دسترس بازدید شود ادامه پیدا می کند. بعد از آن تمامی شی ها به جز آن هایی که علامت گذاری شده اند حذف می شوند.
مثالی ساده از الگوریتم Mark-and-sweep
اولین مرحله جمع آوری ریشه ها است، از شی عمومی شروع به پیمایش می کنیم و به تمامی شی هایی که قابل دسترس هستند رجوع می کنیم و آن ها را به خاطر می سپاریم. سپس برمی گردیم و آن ها را علامت گذاری می کنیم.
به وضوح می توان دسته ای غیر قابل دسترس را در سمت راست دید. در مرحله بعد تمامی شی هایی که علامت گذاری نشده اند را حذف می کنیم که دسته سمت راست جزء همین دسته هستند.
دانستن این مبحث به عنوان یک برنامه نویس بسیار اهمیت دارد، زیرا بعضی از ابزار ها این موضع را جدی تر گرفته و در صورت آشنا نبودن با این مبحث ممکن است که باگ هایی از منابع نا آشنا برای برنامه نویس بوجود آید که مشکل ساز باشد. در نتیجه می توان گفت که دانستن این موضوع برای برنامه نویس حرفه ای، مخصوصا برنامه نویس جاوا اسکریپت از اهمیت بالایی برخوردار است.
خلاصه مقاله
- Garbage collection به صورت خودکار و پنهان انجام میشود.
- شی ها تا زمانی که قابل دسترس باشند حذف نمی شوند.
- garbage collection توسط 2 الگوریتم حافظه را مدیریت میکند.
- الگوریتم رفرنس شماری (Reference-counting garbage collection )
- الگوریتم نشان و گردش (Mark-and-sweep algorithm)
- وجود garbage collection می تواند عملکرد و بعضاً اشتباهات برنامه نویس ها که کد های بلا استفاده دارند را بهتر کند.
منابع
- برای اینکه در این موضوع عمیق تر شوید پیشنهاد می کنم که به سایت javascript.info مراجعه کنید.
- همانند همیشه wikipedia
- مثل همیشه مقاله های medium
برای دسترسی به مطالب بیشتر راجب به جاوا اسکریپت می توانید به بخش مقالات جاوا اسکریپت در وبسایت مگادمی مراجعه کنید.
عالی بود