Garbage Collection یکی از کارهای بسیار مهم در مدیریت حافظه در برنامه نویسی است. این ابزار به مدیریت خودکار فرایند تخصیص حافظه کمک می‌کند. برای انجام این کار هم از روش‌هایی مانند بازیابی اشیاء بی‌استفاده، آزادسازی منبع حافظه و جلوگیری از نشت حافظه، استفاده می‌کند. Garbage Collection مکانیزمی است که برای کمک به مدیریت بهینه حافظه بدون دخالت دستی توسط کاربر و برنامه نویس طراحی شده است. قبل اینکه بدانیم Garbage Collection چیست باید با مشکلات مربوط به مدیریت حافظه آشنا شویم. برنامه‌های کامپیوتری معمولا میزانی از هدر رفت حافظه و نشتی را به وجود می‌آورند. عدم توجه به چنین مشکلاتی به مرور زمان باعث کندی عملکرد کلی سیستم شده و حتی می‌تواند به توقف ناگهانی برنامه منجر شود. به همین دلیل برنامه‌‌نویسان حرفه‌ای لازم است که با مفهوم Garbage Collection آشنا شده و در صورت نیاز از آن استفاده کنند.

فهرست مطالب این نوشته
997696

زبان‌های برنامه نویسی مدرن از Garbage Collection به صورت درونی استفاده می‌کنند. اما برنامه‌ نویسان هر زبان دارای اختیارات خاص خود درباره روش پیاده‌سازی و استفاده از آن هستند. در این مطلب از مجله فرادرس به مرور کلی روش کار و استفاده از Garbage Collection پرداخته‌ایم. ابتدا با مفهوم آن‌ آشنا شده و می‌بینیم که Garbage Collection چیست، چند مورد از رایج‌ترین الگوریتم‌های Garbage Collection را مرور کرده و سپس درباره روش استفاده و پیاده‌سازی آن در زبان‌های مشهوری مانند جاوا و پایتون توضیحاتی را اضافه کرده‌ایم.

Garbage Collection چیست؟

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

هر زبانی Garbage Collection را به روش خاصی پیاده‌سازی می‌کند. بیشتر زبان‌های برنامه نویسی سطح بالا، نوعی از فن‌آوری Garbage Collection را به صورت «درونی» (Built In) پیاده‌سازی کرده‌اند. از طرف دیگر، زبان‌های برنامه نویسی سطح پایین برای اضافه کردن این ابزار به برنامه‌های خود می‌توانند از کتابخانه‌های تعریف شده به این منظور استفاده کنند.

همین‌طور که در بالا گفته شد، هر زبان برنامه نویسی، روش منحصر به خود را برای اجرای سیستم Garbage Collection دارد. برای مثال، در زبان برنامه نویسی C، توسعه‌دهندگان نیاز دارند که فرایند «تخصیص» (Allocation) و «آزادسازی» (Deallocation) حافظه را شخصا تحت نظر داشته باشند. برای این کار از توابع malloc()  و dealloc() استفاده می‌کند. همین‌طور که می‌بینید نام این توابع از عبارت‌های انگلیسی معادل آن‌ها اخذ شده است. اما در زبان #C توسعه‌دهندگان نیازی به مداخله در فرایند Garbage Collection ندارند. حتی توصیه‌ای هم نشده که شخصا به انجام این کار بپردازند.

در ادامه به بررسی وضعیت مشکلات مدیریت حافظه در زبان‌هایی مانند C و ++C پرداخته‌ایم.

خطرات مدیریت حافظه در زبان های C و ++C

مشکلات مربوط به تخصیص حافظه در زبان‌‌های C و ++C زیرمجموعه‌ای از رایج‌ترین مشکلات کدنویسی هستند که می‌توانند باعث بروز باگ‌های احتمالی و آسیب‌پذیری سیستم شوند. اما این زیرمجموعه، بسیار بزرگ است و فرایند ردیابی، کشف و مدیریت خطای خسته کننده‌ای دارد. باگ‌های مربوط به تخصیص حافظه در زبان‌های C و ++C شامل سناریو‌های زیر می‌شوند.

  • مشکل در رهاسازی حافظه‌ای که تخصیص داده شده: این مشکل زمانی روی‌ می‌دهد که برنامه به متغیرها یا فایل‌های خود در حافظه کامپیوتر، فضایی را برای انجام کار اختصاص داده است. اما بعد از آنکه فرایند انجام کار به پایان رسید، فضای اختصاص داده شده با این حافظه، آزاد نمی‌شود. بر اثر رخ دادن پیاپی این اتفاق و به مرور زمان، تمام فضای RAM پُر خواهد شد. این ماجرا در نهایت نه تنهای منجر به مسدود شدن برنامه می‌شود، بلکه حتی ممکن است کل کامپیوتر را نیز دچار مشکل کرده و با توقف ناگهانی عملکرد کامپیوتر روبه‌رو شویم.
تصویر هنری بهینه‌سازی حافظه از طریق جمع‌آوری زباله - Garbage Collection چیست
  • استفاده از «اشاره‌گر آویزان» (Dangling Pointer): این حالت وقتی پیش می‌آید که برنامه برای خواندن یا نوشتن در بافر از اشاره‌گرهایی استفاده می‌کند که به دلایل تصادفی آزاد شده و به هیچ فضایی اشاره نمی‌کنند. حتی ممکن است که این اشاره‌‌گرها به آدرس غلط با اطلاعات غلطی اشاره کنند. در این حالت هم ممکن است کل سیستم با مشکل روبه‌رو شود.
  • آزاد‌سازی دوباره بلوک‌های حافظه: وقتی که برای آزادسازی بلوک حافظه‌ای به اشتباه و بیش از یک‌بار تلاش کنیم، امکان دارد که این عملیات، باعث توقف ناگهانی عملکرد سیستم مدیریت حافظه شده و در نهایت حتی منجر به کرش کردن کل کامپیوتر شود.

سایر مشکلات رایج و نقاط آسیب‌پذیر زبان‌های C و ++C شامل استفاده بیش‌ از حد از بافر و به‌کارگیری خطرناک داده‌های استرینگ در برنامه نویسی است. به‌کارگیری ناایمن استرینگ می‌تواند منجر به بازنویسی کدهای نوشته شده توسط داده‌هایی شود که فقط قرار بود در متغیرها نگهداری شوند. تزریق کدهای مخرب به داده‌هایی که احتمال اجرا شدن‌ دارند، یکی از راه‌های سوءاستفاده هکر‌ها از این مسئله است.

شاید فکر کنید که سیستم‌های مدرن و محافظت شده‌ای که دارای بخش‌های مجزا برای کدها و داده‌ها هستند، از رویدادن چنین حملاتی جلوگیری می‌کنند. اما متاسفانه هنوز هم احتمال وجود آسیب‌پذیری در بعضی از سناریو‌ها وجود دارد. برای مثال، برنامه‌ای را در نظر بگیرید که عبارت‌های SQL را به صورت متن رشته‌ای ایجاد کرده و سپس برای اجرا آن‌ها را به پایگاه داده می‌فرستد. این نوع از حملات معمولا منجر به آسیب‌ دیدن پایگاه داده SQL می‌شوند. البته الگوهای رفتار‌ی بسیار خوبی وجود دارند که برای جلوگیری از بروز چنین حملاتی – «آسیب پذیری تزریق اس کیو ال» (SQL Injection) – مستندسازی شده‌اند. اما به طور مداوم باگ‌های جدیدی در استفاده کاربران از SQL ظاهر می‌شوند. یعنی اینکه همه برنامه نویس‌ها از این الگو‌های رفتاری در زمان طراحی سیستم پیروی نمی‌کنند.

چگونه با فرادرس، برنامه‌نویسی را بهتر یاد بگیریم؟

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

مجموعه آموزش برنامه نویسی – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش برنامه نویسی از مقدماتی تا پیشرفته فرادرس هدایت شوید.

از طرف دیگر کار با کامپیوتر و توانایی پیاده‌سازی ایده‌ها و الگوریتم‌ها تبدیل به بخشی جدایی‌ناپذیر از فرایند تحقیق و پژوهش در اکثر شاخه‌های علمی، شده است. به همین دلیل در فرادرس تلاش کرده‌ایم تا موارد مورد نیاز برای آموزش بیشتر زبان‌های برنامه نویسی را فراهم کنیم. در ادامه چند مورد از فیلم‌های آموزشی برنامه نویسی تهیه شده در فرادرس را معرفی کرده‌ایم. در صورت تمایل با کلیک بر روی تصویر بالا به صفحه اصلی این مجموعه آموزشی رفته و از گزینه‌های بسیار زیاد موجود دیدن کنید.

نواقص موجود در Garbage Collection چیست؟

استفاده از مکانیزم Garbage Collection می‌تواند به صورت کامل مشکلات اصلی مربوط به تخصیص و رهاسازی حافظه‌ را حل کند. اما در نهایت استفاده از این سیستم هم دارای هزینه‌های مشخصی است. از جمله بزرگترین مشکلات مربوط به استفاده از Garbage Collection افزایش سربار، توقف‌های غیرقابل پیش‌بینی برنامه در زمان اجرای GC و افزایش وقفه‌های زمانی، مخصوصا در پردازنده‌های سرور هستند. وجود چنین وقفه‌هایی به طور خاص در سرور‌هایی مبتنی بر جاوا قابل توجه – و مشکل‌زا – هستند.

سربار هزینه در استفاده از Garbage Collection چیست؟

سربار هزینه‌های مربوط به مصرف منابع در Garbage Collection می‌تواند چشم‌گیر باشد. برای مدیریت این سربار هزینه‌ها باید ارتباط متعادلی بین مدیریت حافظه و افزایش بهره‌وری سیستم به وجود بیاید. دو نفر از دانشمندان حوزه علوم کامپیوتر، آقایان «متیو هرتز» (Matthew Hertz) و «امری برگر» (Emery D. Berger) در یکی از مطالبشان با هدف اینکه بیان کنند Garbage Collection چیست و چه نواقصی دارد به نکته مهمی درباره کیفیت این تکنولوژی اشاره کرده‌اند.

بعد از آزمایشات مختلف مشخص شده است که در زمان پیاده‌سازی GC، استفاده از حافظه به میزان ۵ برابر بیشتر از نیاز واقعی برنامه، توسط الگوریتم Generational Collector نسل اپل، مانند مدیریت صریح و دستی حافظه به خوبی عمل می‌کند. اگر فقط به اندازه ۳ برابر حافظه مورد نیاز برنامه را استفاده کنیم، سیستم Garbage Collection به طور میانگین ۱۷٪ آهسته‌تر از فرایند مدیریت حافظه دستی اجرا می‌شود. به همین‌ترتیب اگر فقط از دو برابر حافظه استفاده کنیم، میزان کارایی Garbage Collection به اندازه ۷۰٪ کاهش پیدا می‌کند. و وقتی که میزان حافظه در دسترس محدود شده باشد، فرایند صفحه‌بندی حافظه باعث می‌شود که Garbage Collection چندین برابر کند‌تر از مدیریت حافظه دستی عمل کند.

الگوریتم Generational Collector اپل از رویکرد بسیار محافظه‌کارانه‌‌ای پیروی می‌کند. البته بیشتر تکنیک‌های جدید و تهاجمی Garbage Collection ، بعضی‌ از اوقات می‌توانند با استفاده از میزان حافظه کم، عملکرد بهتری را از خودشان بروز دهند.

منظره سایبری نشان‌دهنده جمع‌آوری زباله و بهینه‌سازی منابع - Garbage Collection چیست

افزایش وقفه های زمانی

وجود Garbage Collection می‌تواند باعث بروز وقفه در روند اجرای عملیات شود. بنابراین برای زبان‌های‌ برنامه نویسی، چندان مناسب نیست که از آن در برنامه‌های نیازمند به اجرای بدون تاخیر استفاده کنند. به عنوان مثال می‌توان به سیستم‌های بی‌درنگ و سرور‌های بسیار فعال اشاره کرد. برای نمونه، بعضی از توسعه‌دهندگان در زمان ساخت نسخه‌های بی‌درنگ زبان برنامه نویسی لیسپ و زبان جاوا و با هدف جلوگیری از بروز وقفه در عملکرد سیستم، مجبور به تغییر دادن یا حذف کامل مکانیزم Garbage Collection شدند.

بنابرای، لازم است به این نکته توجه کنیم که راه حل مدیریت افزایش وقفه‌های زمانی در زمان استفاده از Garbage Collection چیست. اخیرا بعضی از سرور‌های اسکالا و جاوا طوری نوشته شده‌اند که از زبان‌های حاوی Garbage Collection استفاده نکنند. برای مثال نرم‌افزار پایگاه داده Scylla که بازنویسی از پایگاه‌داده Cassandra است، با زبان ++C نوشته شده. به همین‌ ترتیب Redpanda هم به عنوان جایگزینی برای Kafka تولید شده است. هر دوی این موارد در عملکرد خود با وقفه‌های کمتری روبه‌رو شده و برای مدیریت حجم یکسانی از کارها به سرور‌های کمتری احتیاج دارند.

الگوریتم‌ های Garbage Collection

برای کار کردن با Garbage Collection به بهترین شکل ممکن باید با انواع داده‌ها و ساختارهای مدیریت و ذخیره‌سازی اطلاعات آشنا شویم. در این صورت است که می‌توانیم بهترین الگوریتم را برای استفاده در Garbage Collection انتخاب کنیم. برای رسیدن به این هدف، پیشنهاد می‌کنیم که فیلم آموزش رایگان انواع داده و ساختارهای مدیریت و ذخیره سازی اطلاعات را از فرادرس مشاهده کنید. به منظور کمک به مخاطبان مجله، لینک این فیلم را در پایین نیز قرار داده‌ایم.

نمی‌توان به شکل واضحی بیان کرد که بهترین الگوریتم Garbage Collection چیست. زیرا در شرایط مختلف عملیاتی الگوریتم‌های متفاوت نتایج متنوعی را تولید می‌کنند. تعداد زیادی الگوریتم مختلف برای مدیریت مکانیزم Garbage Collection وجود دارد. در فهرست زیر مهم‌ترین الگوریتم‌ها را نام برده‌ایم.

  1. الگوریتم شمارش ارجاع
  2. الگوریتم Tracing Garbage Collection
  3. الگوریتم Mark and Sweep
  4. الگوریتم Copying Collection
  5. الگوریتم Mark and Compact
  6. الگوریتم Generational Collection

در ادامه این بخش از مطلب الگوریتم‌های نامرده شده در بالا را بررسی کرده‌ و ویژگی‌های مهم آن‌ها را توضیح داده‌ایم.

الگوریتم شمارش ارجاع

در الگوریتم «شمارش ارجاع» (Reference Counting)، برنامه به شکل کامل نرخ تعداد ارجاع‌ها یا اشاره‌گرهایی را ذخیره می‌کند که آدرس منابع مختلف را نشان می‌دهند. هربار که اشاره‌گر جدیدی آدرس منابع مختلف را نگهداری می‌کند، مقدار نرخ به اندازه یک واحد افزایش می‌یابد. با کاهش منابع مورد اشاره، مقدار نرخ هم کاهش پیدا می‌کند. وقتی که نرخ ارجاع به صفر برسد، آن منبع می‌تواند آزاد شود. Garbage Collection در حافظه فقط یکی از اپلیکیشن‌هایی است که برای شمارش منابع به کار برده می‌‌شوند. این الگوریتم برای مدیریت اشیاء سیستمی، اشیاء Windows COM، بلوک‌های فایل سیستم و فایل‌های معمولی هم به‌ کار برده شده است.

استفاده از الگوریتم شمارش ارجاع دو نقطه ضعف اساسی دارد.

      • وجود تعداد به‌روز‌رسانی‌های بسیار زیاد
      • «ارجاع‌های حلقه‌ای» (Circular References)

یکی از راه‌ها برای کنترل مشکل مربوط به وجود تعداد به‌روز‌رسانی‌های زیاد این است که به کامپایلر اجازه‌ دهیم تا اشیاء مرتبط با هم را دسته‌بندی کند. یکی از راه‌های مدیریت «ارجاع‌های حلقه‌ای» هم این است که بعضی وقت‌ها از Garbage Collection خاصی استفاده کنیم که اشیاء غیرقابل دسترسی را به صورت خودکار حذف می‌کند.

برای پیاده‌سازی این الگوریتم‌ها باید از صفحه بندی در سیستم عامل نیز کمک گرفت. در واقع این الگوریتم‌های برای مدیریت حافظه در برنامه‌های در حال اجرا درون سیستم عامل‌ها به کار برده می‌‌شوند. پس بهتر است که درباره این تکنیک هم اطلاعات کافی داشته باشیم. به این منظور، پیشنهاد می‌کنیم که مطلب مرتبط با آن را در مجله فرادرس مطالعه کنید.

الگوریتم Tracing Garbage Collection

این الگوریتم برای ردگیری Garbage Collection استفاده می‌شود. ردگیری GC یکی دیگر از روش‌های جایگزینی است که برای مدیریت حافظه به کار برده شده است. این الگوریتم، کار خود را با اشیاء مشخصی مانند متغیرهای محلی، متغیرهای سراسری یا پارامترهای توابع شروع می‌کند. سپس برای کشف اینکه کدام اشیاء هنوز در حال استفاده‌اند، تمام ارجاع‌ها را دنبال می‌کند. در نتیجه می‌تواند تمام اشیاء غیرقابل دسترسی را شناسایی کرده و حذف کند. Tracing Garbage Collection آن قدر الگوریتم رایجی است که بعضی از اوقات به صورت مستقیم به نام Garbage Collection نیز نامیده می‌شود.

هنر مفهومی پاکسازی حافظه‌های قطعه‌قطعه در برنامه‌نویسی - Garbage Collection چیست

الگوریتم Mark and Sweep

الگوریتم پایه «علامت‌گذاری و پاک‌سازی» (Mark and Sweep) در سال ۱۹۶۰ توسط آقای «جان مک‌کارتی»‌ (John McCarthy) و برای استفاده در زبان برنامه نویسی لیسپ، طراحی شد. روش کاری این الگوریتم را به ترتیب در فهرست زیر بیان کرده‌ایم.

      1. ابتدا برنامه و تمام موارد مرتبط با آن‌ را متوقف می‌کند.
      2. سپس تمام اشیائی که می‌‌توان از مجموعه Root به آن‌ها رسید را با عنوان «درحال استفاده» (In-Use) علامت‌گذاری می‌کند.
      3. در مرحله سوم تمام حافظه را پیمایش کرده و هر بلوکی را که با علامت In-Use علامت‌گذاری نشده، آزاد می‌کند.
      4. در نهایت هم تمام بلوک‌های مانده را پاکسازی کرده و برای شروع دوباره همین عملیات، علامت‌گذاری می‌کند.
      5. توقف سیستم را به پایان رسانده و دوباره اجرای کارهای سیستمی از محل متوقف شده از سرگرفته می‌‌شود.

البته کاملا واضح است که نقطه ضعف این الگوریتم در مدیریت مکانیزم Garbage Collection چیست. الگوریتم Mark and Sweep بخاطر ساختاری که دارد، برای استفاده در سیستم‌های بی‌درنگ مناسب نیست.

نسخه بهینه سازی شده Mark and Sweep

نسخه دیگری از الگوریتم Mark and Sweep وجود دارد که برای مدیریت حافظه از سه رنگ مختلف استفاده می‌کند.

      • بلوک‌های سفید: این بلوک‌ها غیرقابل دسترسی هستند. بلوک‌های سفید اگر تا پایان اجرای الگوریتم به رنگ سفید باقی بمانند، باید آزاد شوند.
      • بلوک‌های سیاه: بلوک‌های سیاه از طریق Root قابل دسترسی هستند و هیچ مرجعی ندارند که به اشیاء موجود در بلوک سفید اشاره کند.
      • و بلوک‌های خاکستری: که از طریق Root قابل دسترسی هستند. اما هنوز باید بابت اشاره آن‌ها به اشیاء موجود در بلوک سفید مورد بررسی قرار بگیرند.

بعد از اینکه فرایند کار الگوریتم به پایان رسید، تمام اشیاء موجود در بلوک خاکستری در نهایت به بلوک سیاه منتقل می‌شوند. در ابتدا، الگوریتم، تمام بلوک‌های متصل به اشیاء Root را با رنگ خاکستری علامت‌گذاری می‌کند. به این معنی که تمام این بلوک‌ها باید بررسی شوند. سایر بلوک‌ها هم با رنگ سفید علامت‌گذای می‌شوند. به این معنا که این بلوک‌ها در حال حاضر غیرقابل دسترسی به نظر می‌رسند.

روال کاری نسخه «سه‌رنگ» (Tri-Color) الگوریتم Mark and Sweep شامل سه مرحله زیر است.

      1. شیئی را از مجموعه خاکستری برداشته و به مجموعه سیاه انتقال می‌دهد.
      2. هر شیئی سفیدی که به مجموعه خاکستری اشاره می‌کند را حرکت می‌دهد. این مسئله تضمین می‌کند که نه این اشیاء و نه اشیائی که به آن‌ها اشاره می‌کنند به عنوان زباله حافظه شناسایی نشده و حذف نشوند.
      3. تا وقتی که مجموعه خاکستری خالی شود دو مرحله قبل را تکرار می‌کند.

وقتی که مجموعه خاکستری خالی شد، می‌توانیم تمام بلوک‌های سفید را آزاد کنیم. الگوریتم سه‌رنگ می‌تواند در پس‌زمینه اجرای برنامه اصلی به کار خود بپردازد. البته هنوز هم امکان بروز سربار در هزینه‌های اجرای عملیات وجود دارد، اما دیگر کل سیستم با توقف روبه‌رو نمی‌شود.

الگوریتم Copying Collection

ایده اصلی الگوریتم Copying Collection – که با نام «Semi-Space GC» هم شناخته می‌شود – بر این اساس است که باید حافظه را به دو قسمت مجزا و با اندازه برابر تقسیم کنیم. این دو بخش را به نام‌های From-Space و To-Space نام‌گذاری می‌کنیم. بلوک‌ها به ترتیب به فضای To-Space اضافه می‌شوند. این کار تا زمان پُر شدن این فضا ادامه دارد. به این طریق، مجموعه اول به وجود می‌آید. سپس، اشیاء زنده با تغییر نقششان از بخش From-Space به بخش To-Space کپی می‌شوند. بر اثر این فرایند، فضای حافظه بی‌استفاده‌ای در انتهای بخش To-Space به‌جا می‌ماند. این فضای اضافه مربوط به اشیائی است که غیرقابل دسترسی‌اند.

ربات‌های هوش مصنوعی در حال جمع‌آوری زباله در محیط‌های دیجیتال Garbage Collection چیست

کپی کردن این مجموعه‌ها شامل چالش‌هایی نیز می‌شود. مسئله اصلی اینجاست که وقتی بلوک‌ها را کپی می‌کنیم، به ترتیب آدرس آن‌ها نیز تغییر می‌کند. راه حل این مشکل آن است که از جدولی برای نگهداری آدرس‌های جدید استفاده کنیم. مشکل بعدی اینجا است که برای کپی‌کردن مجموعه‌ها به دوبرابر حافظه‌ای نیاز داریم که الگوریتم Mark and Sweep استفاده می‌کرد. در هنگامی که بیشتر حافظه را موارد زائد اشغال کرده باشند، استفاده از این الگوریتم با سرعت بیشتری نسبت به الگوریتم Mark and Sweep به نتیجه می‌رسد. اما اگر بیشتر فضای حافظه قابل دسترسی بوده و بلوک‌های زائد کمتر شوند، الگوریتم Copying Collection با سرعت کند‌تری نسبت به Mark and Sweep کار می‌کند.

الگوریتم Mark and Compact

الگوریتم Mark and Compact نیز در اصل مانند الگوریتم Copying Collection عمل می‌کند. با این تفاوت که این الگوریتم فقط از یک فضای حافظه استفاده می‌‌برد. الگوریتم Mark and Compact تمام اشیاء قابل دسترسی را پیدا کرده و به پایین ساختمان داده هیپ انتقال می‌دهد. در نتیجه دربالای هیپ فضای خالی باقی می‌ماند. این فضای خالی قابل استفاده است. بزرگترین نقطه ضعف این الگوریتم آن است که اجرای آن زمان بسیار زیادی صرف می‌کند.

الگوریتم Generational Collection

الگوریتم Generational Collection، هیپ را بر اساس سن‌ اشیاء به چندین بخش مختلف تقسیم می‌کند. معمولا دو یا سه بخش ایجاد می‌شوند. می‌توان گفت که این الگوریتم، اشیاء را به چند نسل مختلف تقسیم می‌کند. به طور کلی، احتمال وجود موارد زائد در بین اشیاء جدید‌تر از اشیاء قدیمی‌تر بیشتر است. بنابراین عاقلانه است که بیشتر اوقات اشیاء جدید را برای کشف موراد زائد بررسی کنیم تا اشیاء قدیمی. بعضی از تکنیک‌های دسته‌بندی نسلی اشیاء از روش‌های مختلفی استفاده می‌کنند یا با نسبت‌های مختلفی اشیاء جدید و قدیم را بررسی می‌کنند.

آموزش برنامه نویسی با فیلم های پروژه محور

بهترین روش برای نهادینه‌سازی آموزش‌ها و دوره‌های گذرانده شده در هر رشته‌ای، استفاده از آن‌ها برای پیاده‌سازی پروژه‌های مربوط به دنیای واقعی است. برنامه نویسی هم از این ماجرا مستثنا نیست. پیاده‌سازی پروژه‌های عملگرایانه برنامه‌ نویسی، یکی از مهم‌ترین و قدترمند‌ترین عوامل برای تبدیل شدن دانشجویان برنامه نویسی به برنامه نویسان با تجربه است. از آنجا که فرادرس تمام تلاش خود را برای ارتقای سطح علمی کشور صرف کرده و در نظر دارد بهترین آموزش‌ها را در اختیار برنامه نویسان جوان قرار دهد، در این زمینه‌هم فیلم‌های آموزشی بسیار مناسبی را تهیه کرده که چند مورد از آن‌ها را در پایین معرفی کرده‌ایم.

در صورت تمایل به دیدن فیلم‌های آموزشی بیشتر یا فیلم‌های مربوط به پیاده‌سازی پروژه‌ها با سایر زبان‌های برنامه نویسی، بر روی تصویر زیر کلیک کرده و به صفحه اصلی این مجموعه آموزشی هدایت شوید.

مجموعه آموزش پروژه محور برنامه‌ نویسی – مقدماتی تا پیشرفته
با کلیک بر روی تصویر بالا می‌توانید به صفحه اصلی مجموعه فیلم‌های آموزش پروژه محور برنامه‌ نویسی هدایت شوید.

چه زبان هایی از Garbage Collection استفاده می‌کنند؟

تا اینجای کار متوجه شدیم که Garbage Collection چیست. در این بخش می‌بینیم که چه‌ زبان‌های برنامه نویسی با چه روش‌هایی از آن استفاده می‌کنند.

همین طور که در بالا اشاره شد، زبان برنامه نویسی لیسپ از وقتی که توسط آقای «جان مک‌کارتی» ایجاد شده از مکانیزم Garbage Collection برای مدیریت حافظه استفاده می‌کند. زبان‌های جاوا، اسکالا، پایتون و «#NET/C.» از جمله زبان‌های مشهوری هستند که با مکانیزم Garbage Collection کار می‌کنند.
اما زبان‌های نسبتا جوان دیگری مانند زبان‌های برنامه نویسی سوئیفت، Go، روبی، D و OCaml و زبان‌های قدیمی‌تر Eiffel و Haskell و ML و Modula-3 و Perl و Prolog و Scheme و Smalltalk نیز از ابزار GC برای مدیریت حافظه و جلوگیری از اتلاف آن استفاده می‌کنند.

روش استفاده Garbage Collection در زبان های شاخص

زبان‌های برنامه نویسی جاوا، پایتون و #NET/C. تقریبا مشهور‌ترین زبان‌هایی هستند که Garbage Collection را به صورت درونی پیاده‌سازی کرده و استفاده می‌کنند. در واقع «ماشین مجازی جاوا»‌ ( Java Virtual Machine | JVM) از چهار ابزار Garbage collector متفاوت به نام‌های Serial و Parallel و Concurrent Mark and Sweep و G1GC استفاده می‌کند. G1GC سرنامی از عبارت انگلیسی «زباله اولین جمع‌آوری زباله» (Garbage First Garbage Collector) است. اکنون از نسخه G1GC در جاوا به صورت پیش‌فرض استفاده می‌شود. نسخه G1GC، نوعی از الگوریتم Garbage Collector است که با تقسیم کردن حافظه به بخش‌هایی برای نسل‌ها و ناحیه‌های مجزا از هم کار می‌کند. این الگوریتم طوری طراحی شده که برای رسیدن به هدف بهینه‌سازی حافظه به شکل بی‌درنگ برسد.

تصویر هنری بهینه‌سازی حافظه از طریق جمع‌آوری زباله - Garbage Collection چیست

زبان پایتون و به طور خاص پیاده‌سازی نسخه CPython از الگوریتم‌های «شمارش‌ ارجاع» (Reference Counting) و Generational Collection سه سطحی به صورت ترکیبی استفاده می‌کند. این سیستم به طور خاص، تمرکز خود را بر پاکسازی اشیاء Container قرار داده است.

«NET CLR.» از الگوریتم Generational Collection سه سطحی استفاده می‌کند که شبیه به Mark and Compact است. این تکنیک، حافظه را به دو هیپ جداگانه تقسیم می‌کند. یکی را برای اشیاء بزرگ با اندازه بیش از ۸۵۰۰۰ بایت استفاده کرده و دیگری را برای اشیا کوچک‌تر به‌ کار می‌برد. هیپ مربوط به اشیاء بزرگ معمولا فشرده‌سازی نشده و فقط از الگوریتم Mark and Sweep استفاده می‌کند. اما در صورت نیاز می‌توان در این بخش هم از الگوریتم Mark and Compact استفاده کرد.

جمع‌بندی

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

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

source

توسط expressjs.ir