پرش به مطلب اصلی

Garbage Collection

توی برنامه همیشه ما با حافظه کار میکنیم و اگه هیچ وقت این فضا آزاد نشه به Memory leak میخوریم. فرایند GC تا اینجایی که من فهمیدم روی متغیرهای که توی heap قرار میگیرن انجام میشه. چون مقادیر داخل stack با خارج شدن از اون اسکوپ به صورت خودکار انجام میشه. خوده فرایند gc کاری زمان بر و بلاکینگی هستش بخاطر همین بعضی زبون ها یا ندارن مثل C++ یا تکنیک های برای بهبود انجام میدن مثل گولنگ.

یک اصطلاحی هم در GC هست به اسم Stop the world که میگن gc ها کل اپ رو بلاک میکنن که حافظه رو پاک کنه به اختصار بهش میگن STW


الگوریتم های GC

reference counting

  • Each object has a counter tracking the number of references to it. هر ابجکتی یه شمارشگر داره که تعداد رفرنس های که بهش شده رو نشون میده و اگر ۰ باشه یعنی میتونیم پاکشون کنیم. فقط بدی بزرگش اینه که رفرنس های دایره ای رو نمیتونه هندل کنه

Mark and Sweep

توی این تکنیک حافظه از یه روتی اسکن میشه مثلا گلوبال یا استک و متغیر نشانه گذاری میشه(فاز mark) و در مرحله بعد اون های که دسترسی پذیر نیستن پاک میشن

Tri-color

حالا یکی از تکنیک ها نشان گذاری همین Tri-color هستش. یعنی gc میاد متغیرها رو به سه دسته تقسیم میکنه. سفید: چیزایی که هنوز بررسی نشدن یا در دست استفاده نیستن(با اسکن از روت ها هنوز بهش نرسیدیم) خاکستری: هنوز همه اش بررسی نشدن سیاه: اونایی که کامل بررسی شدن و در دست استفاده ان

در نهایت GC ابجکت های سفید رو پاک میکنه

write barrier

یکی از بهبود های که میشه داد و جلو تاخیر های GC رو گرفت استفاده از همین تکنیکه یعنی به جای اینکه برنامه کل حافظه رو اسکن کنه از این طریق هر تغییری که توی حافظه داده میشه رو به GC میگیه که کارش رو شروع کنه برای تغییرات

Mark and Compact

دقیقا مثل روش قبله ولی با این تفاوت که یه فاز defragment هم داره

visualized: https://spin.atomicobject.com/visualizing-garbage-collection-algorithms/