زباله روبی Garbage Collection – GC
زباله روبی یا جمع آوری زباله (Garbage Collection) چیست؟
زباله روبی (Garbage Collection یا به اختصار GC) اصطلاحی در حوزه مدیریت و بازیابی خودکار حافظه (مموری) است و به فرایندی اشاره میکند که طی آن فضای اشغال شده توسط اشیائی که مورد نیاز برنامه نیستند به صورت خودکار آزاد میشود.
وظیفه انجام این کار بر عهده عاملی موسوم به زباله روب یا جمع آوری کننده زباله (Garbage Collector) است. این عامل تلاش میکند فضایی از حافظه که حین ایجاد و استفاده از یک شئ به آن اختصاص داده (Allocate) شده است و دیگر برنامه به آن نیازی ندارد را برای استفاده مجدد آزاد کند (از این رخداد با عنوان Deallocate کردن یا نابود کردن (Destroy) شئ نیز یاد میشود). اشیاء مذکور اصطلاحا با نام زباله (Garbage) یا اشیاء مرده (Dead Objects) شناخته میشوند.
جالب است بدانید Garbage Collection اولین بار توسط جان مک کارتی (John McCarthy) در سال 1959 برای زبان Lisp طراحی شد.
زباله روبی در نقطه مقابل مدیریت دستی حافظه (Manual Memory Management) قرار میگیرد که در آن شخص برنامه نویس وظیفه دارد اشیائی که دیگر به آنها نیازی نیست را مشخص و حافظه منتسب به آنها را آزاد کند.
در اغلب زبان های برنامه نویسی سطح بالا از قابلیت Garbage Collection به صورت پیشفرض یا درونی ساز (built-in) پشتیبانی میشود. البته برخی از زبان های امروزی علاوه بر زباله روبی خودکار از قابلیتهایی برای مدیریت دستی حافظه نیز برخوردار هستند. در مورد تعدادی از زبان های سطح پایینتر نظیر C و C++ که در آنها اساسا برنامه نویس مسئول جمع آوری کردن زباله هاست امکان استفاده از پیاده سازی های Garbage Collection وجود دارد.
در بسیاری از زبان های برنامه نویسی متدی موسوم به Destructor (مخرب یا نابودساز) یا Finalizer (نهایی ساز) در کلاس ها قابل تعریف است که هنگام نابودی شئ فراخوانی میشود. این تابع برخلاف تابع سازنده نمیتواند هیچ پارامتری داشته باشد.
مزایا و معایب زباله روبی
زباله روبی علاوه بر تسهیل برنامه نویسی به جلوگیری از بروز مشکلات و باگ های مربوط به مدیریت دستی حافظه نیز کمک میکند. برای مثال فراموش کردن یا نادیده گرفتن آزادسازی فضای متعلق به زباله ها توسط برنامه نویس یکی از مشکلات مدیریت دستی حافظه به شمار میرود که میتواند به کمبود حافظه بیانجامد. آزادسازی مضاعف (Double free) حافظهای که قبلا آزاد شده است نیز یکی دیگر از باگ هایی است که حین انجام این کار توسط برنامه نویس ممکن است رخ دهد.
در عین حال این نکته را نیز در نظر داشته باشید که جمع آوری زباله میتواند معایبی همچون کاهش سرعت اجرای برنامه و مصرف منابع بیشتر را نیز به همراه داشته باشد. همچنین معمولا زمان دقیق Garbage Collection غیرقابل پیش بینی و تقریبا غیر قابل کنترل است.
روش های جمع آوری زباله
موضوعی که در Garbage Collection از اهمیت بالایی برخوردار است شناسایی اشیاء بلااستفاده یا به عبارت بهتر اشیائی است که شایسته زباله روبی هستند.
زباله روبی با کمک ردیابی (Tracing garbage collection)، رایجترین و اصلیترین روش برای شناسایی و جمع آوری زباله ها به شمار میرود. در این روش پس از ردیابی اشیاء قابل دسترسی (Reachable) در زنجیرهای از ارجاعات، سایر اشیاء به عنوان گزینههایی که میبایست حافظه تخصیصی به آنها آزاد شود شناسایی میشوند.
در روشی دیگر موسوم به شمارش ارجاعات (Reference Counting garbage collection) تعداد ارجاعات به هر شئ نگه داری میشود و در صورتی که برای یک شئ، این عدد برابر با صفر باشد به عنوان زباله تشخیص داده میشود و حافظه تخصیصی به آن آزاد خواهد شد.
در تصویر زیر میتوانید نمایی مفهومی از مراحل انجام یک Garbage Collection فرضی را مشاهده کنید. همانطور که در این تصویر میبینید زباله روب مورد مثال پس از شناسایی و آزادسازی فضای اشغال شده توسط زباله ها، فضای مربوط به اشیاء قابل دسترس (یا زنده) را در کنار یکدیگر مرتب (اصطلاحا کامپکت Compact) میکند تا سرعت اجرای برنامه افزایش یابد.

پیوندهای پیشنهادی تک دیک
سلام.وقت بخیر.ممنون از مطالب و توضیحات مفید؛ یک سوال داشتم، آیا در زبان های سطح بالایی از قبیل جاوا با وجود Garbage Collection کاملا از لحاظ مموری خیالمون میتونه راحت باشه؟ یا معایبی به جز کند شدن سرعت برنامه و… ، در مموری هم ایجاد میکنه؟ ممنون میشم راهنمایی کنید.
سلام وقت شما هم بخیر
همونطور که گفته شد نمیشه به طور صد در صد گفت این فرایند چه زمانی حافظه اختصاص داده شده به یک زباله رو آزاد می کنه. اگر پروژه بزرگی دارید که این موضوع در اون خیلی اهمیت داره بهتر هست از زبان های سطح پایین و متوسط استفاده کنید و شخصا حافظه رو مدیریت کنید. که البته موضوع پیچیده و نیازمند تبحر و دقت زیاد هست. با این حال طبیعتا زباله روبی برای اغلب کاربردها و پروژه ها عملکرد مناسبی داره و مشکلی وجود نخواهد داشت. نمونه هایی از مهم ترین معایب هم داخل متن بهش اشاره شد. امیدوارم توضیحات مفید بوده باشه.