1. Home
  2. »
  3. C#
  4. »
  5. Garbage Collector چیست؟
Garbage Collector چیست؟

خلاصه این مطلب :

Garbage Collector چیست؟

Garbage Collector چیست؟
Garbage Collector چیست؟

حتما در برنامه های ما زمانی وجود دارد که باید اشیاء دیگری که توسط شی جاری خود ایجاد کرده ایم را ببندیم، برای مثال شی ای که ورود و خروج کاربران را در شبکه کنترل می نماید یا در موارد بسیار ساده تر زمانی که باید Connection موجود بین برنامه و DB را در انتهای برنامه ببندیم و چندین و چند مثال دیگر …
برای انجام چنین وظایفی، باید با استفاده از متود Finalize و Dispose (بعدا توضیح می دهم) و همچنین استفاده از کلاس Garbage Collector موجود در Framework چنین کارهایی را انجام دهیم.

متود Finalize چیست؟
Finalize متود ویژه ای است که Garbage Collector قبل از خارج کردن شی از درون Heap Memory آن را فراخوانی می نماید. این متود کم و بیش شبیه رویداد Class_Terminate در Visual Basic 6 می باشد. اما تفاوت هایی نیز وجود دارد. در VB6 بلافاصله بعد از قرار دادن شی به Nothing شی رویداد Class_Terminate را فراخوانی می نماید ولی حال این قضیه صادق نمی باشد.
به طور کل تمامی اشیاء موجو در .NET Framework متود Finalize را از کلاس System.Object به ارث می برند به همین دلیل در زمان استفاده از متود Finalize دو خصوصیت Protected و Overrides را به کار برید.

برنامه ای که در پایین مشاهده می نمایید نحوه استفاده از متود Finalize را بهتر نشان می دهد. برای دیدن نحوه کار مناسب برنامه لطفا مراحل زیر را انجام دهید.
۱٫ پروژه ی جدیدی را در .Net باز نمایید.
۲٫ ویندوز فرم Form1 را از پروژه حذف نمایید.
۳٫ کلاسی با عنوان Person ایجاد نمایید.
۴٫ ماژولی نیز با عنوان MainModule ایجاد نمایید.
۵٫ در Property Page برنامه، خاصیت Startup Object را روی Sub Main تنظیم نمایید.

 

 

۶٫ دگمه F5 را فشار دهید.
۷٫ نتیجه را در پنجره Output ببینید.

همانطور که متوجه شدید به علت اینکه Garbage Collector تنها زمانی فعال می شود، که یا برنامه برای ایجاد اشیاء جدید به حافظه بیشتری احتیاج داشته باشد و یا زمانی که خود برنامه Terminate شود. به همین علت باید به این نکته توجه نماییم :
در متود Finalize هیچ شی جدیدی را ایجاد یا فراخوانی ننمایید. بدلیل اینکه شی منبع به طور کامل از بین می رود پس خود شی جدید نیز به عنوان یک Garbage شناسایی می شود و امکان برخورد با یک Exception پدید می آید.

روش فراخوانی دستی Garbage Collector از طریق برنامه :
برای فراخوانی Garbage Collector می توان به دو طریق عمل کرد :
۱٫ ایجاد متناسب اشیاء اضافی برای ایجاد کمبود در Heap Memory و ضرورت استفاده System از Garbage Collector.
۲٫ فقط کافیه به Garbage Collector اعلام کنیم تا دستور را انجام دهد !؟؟؟

برای این کار در داخل .NET Framework کلاسی تحت عنوان GC وجود دارد که دارای متودهای مختلفی است. مهم ترین این متود ها عبارتند از Collect و WaitForPendingFinalizers و SuppressFinalize (در زمان شرح متود Dispose این متود را توضیح می دهم). کد پرسیجر TestFinalize را به صورت زیر تغییر دهید.

حال برنامه را دوباره اجرا نمایید. و نتیجه را مشاهده نمایید.

متود Collect که مشخص است دستور جمع آوری را صادر می نماید و اما متود WaitForPendingFinalizers اجرای برنامه را تا Finalize صحیح همه اشیاء اضافی موجود در Heap Memory متوقف می نماید.
ذکر این نکته لازم است که استفاده مکرر از کلاس GC نمی تواند ایده مناسبی برای برنامه ما باشد زیرا GC.Collect() سبب جستجوی مکرر در Heap Memory می گردد تا با پیدا کردن اشیاء اضافی آنها را Finalize نمایید، لذا این مسئله در برنامه های بزرگ باعث از بین رفتن یکی از خصوصیات مثبت Framework جدید یعنی Optimizing (بهینه بودن) می گردد. توصیه می شود تنها در زمانی که برنامه در حالت بیکاری به سر می برد از این متود استفاده نمود به عنوان مثال می توان به زمان انتظار برنامه برای ورود اطلاعات از طرف کاربر اشاره نمود).

 

منبع : انجمن برنامه نویس

امتیاز این post

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

لطفا ابتدا به حساب کاربری خود وارد شوید