همه اشیایی که ما ایجاد میکنیم در فضایی از حافظه به نام #heap ذخیره میشن در این میان اشیایی که عمرشون به پایان رسیده باشه و دیگه رفرنسی بهشون نباشه حکم یک زباله پیدا میکنن که باید توسط #gc از حافظه heap پاک شن . حالا اینکه gc بر چه اساسی تشخیص بده که باید کدوم ابجکت هارو پاک کنه یا نه ، براش #الگوریتم هایی نوشتن که یکی از اون الگوریتم ها Mark-and-Sweep هست .
✅نحوه کاردکرد این الگوریتم : همه الگوریتم های gc دوکار رو باید انجام بدن : 1- تشخیص ابجکت های غیرقابل دسترس (mark) 2- حذف اون ها از حافظه و دردسترس کردن حافظه برای اشیای دیگر (sweep)
در مرحله mark به این صورت که وقتی شی ای وجود داره و به جایی رفرنس داره اون بعنوان یک شی قابل دسترس شناخته میشه و با true مارک میشه وگرنه با false
حالا اگر وجود اشیا تو هیپ رو بصورت یک گراف در نظر بگیریم ، gc از روت شروع میکنه تا به آخر. و اون مارکهایی که به هرایجکت زده شده رو چک میکنه و تا به جایی برسه که با false مارک شده، اونو به عنوان یک ابجکت unReachable تشخیص میده و اون رو حذف میکنه از هیپ
#دپریکیت شدن این الگوریتم و چرا :
این الگوریتم دوتا مشکل داره : 1-در فرایندی که گربج کالگتور داره اجرا میشه فرایند اجرای برنامه ساسپند میشه 2- حذف اشیا به صورت ناپیوسته انجام میشه ! بدین صورت که فضای های خالی و پر درکنارهم قرار دارن و فضاهای خالی مابین فضاهای پر ، آنقدر کم هست که گنجایش یک شی بزرگتر رو نداره و باعث میشه با اینگه فرض ده تا فضای خالی کوچک ناپیوسته داریم نتونیم یک شی بزرگتر رو در اون فضا بگنجونیم ! چرا؟ چون این فضاهای خالی ناپیوسته هست و درکنار هم نیست !
البته الگوریتم های جدیدتری که عملکرد بهتری داشتن از جاوا9 معرفی شدن مثل G1 . یک نکته ای در ادامه توضیحات بالا: این که هیپ در حقیقت فضایی فیکسی هست که بهش مموری ازاد هم میگن وقتی آبجکت یا تردی نیاز به مموری داره این بخش از مموری از هیپ حذف میشه و به آبجکت یا ترد اختصاص داده میشه همینطور که اشیا ساخته میشن و فضای هیپ کمتر میشه از یک جایی که فضای هیپ کم میشه گاربیج کالکتور فعال میشه و باالگوریتم های موجود شروع به کار میکنه و اون فضا رو به هیپ بر میگردونه.