طول عمر یک شی در net framework.

پنجشنبه 8 مرداد 1394

دراین مقاله چگونگی ایجاد یک شی و تخصیص حافظه (allocate) به آن و بازپس گرفتن حافظه (deallocated) پس از خروج از بلوک را بررسی خواهیم کرد.

طول عمر یک شی در net framework.

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

کلاس یک طرح کلی است که شرح می دهد که یک شی ازاین نوع چگونه درحافظه ظاهر می شود. این نمونه، یک شی از نوع آن کلاس است. زمانی که کلمه کلیدی new استفاده می شود، یک بلاک از حافظه تخصیص داده می شود و سازنده کلاس فراخوانی می شود. 

این بلاک حافظه برای نگه داری شی، به اندازه کافی بزرگ است. هنگامی که متغیر یک کلاس را تعریف میکنیم، در پشته ذخیره می شود اما زمانی که به  کلمه کلیدی new رسیدیم، درheap ذخیره می شود. هنگامی که  یک شی با کلمه کلیدی new ازکلاس در c# ایجادمی شود، یک حافظه روی heap به آن اختصاص داده می شود. البته کلمه کلیدی new به یک refrence از شی درheap ارجاع می دهد نه خود شی.  این متغیر reference برای استفاده دیگر روی پشته ذخیره می شود.

زمانی  که عملگر new برای ساخت یک شی استفاده می شود، حافظه از یک heap مدیریت شده برای این شی گرفته می شود و heap مدیریت شده فراتر از یک تکه تصادفی از حافظه قابل دسترسی توسط CLR است. زمانی که یک شی برای مدتی استفاده نمی شود، حافظه اختصاص داده شده به آن گرفته می شود و این حافظه دوباره قابل استفاده است.

ستون اصلی دات نت فریم ورک، Garbage Collection خودکار است که حافظه را برای Net. مدیریت می کند. زمانی که یک شی ساخته می شود، اگر برای مدتی از آن استفاده نشود توسط Garbage Collector از بین می رود. هیچ تخصیص حافظه صریحی وجود ندارد، زیرا garbage collector، اشیای بلااستفاده را پیدا می کند و یک Collection برای خالی کردن حافظه می سازد که این یک فرایند خودکار است. Garbage Collector، زمانی که اشیای شما توسط هیچ یک از قسمت های کد شما قابل دسترسی نیست، آن را از Heap حذف می کند. Net garbage collector. برای بهینه سازی کد، بلاک های خالی را نیز یکی می کند تا به هم پیوسته شوند.
heap به سه نسل طبقه بندی می شود، پس می تواند اشیای long-lived (زمان زیادی در برنامه استفاده می شوند) و short-lived(زمان زیادی در برنامه نمی مانند) را کنترل کند.
Garbage collection معمولا با بازیابی اشیای short-lived اتفاق می افتد، که معمولا قسمت کوچکی از heap را اشغال کرده است.


نسل ها (Generations):

در heap سه نسل از اشیا وجود دارد:

نسل 0: شی های  تازه ایجاد شده در این نسل هستند. این اشیا به طور متناوب جمع آوری می شوند تا مطمئن شویم، اشیای short-lived به سرعت جمع آوری شده و حافظه آزاد می شود. دراین نسل  شی هایی که در حافظه باقی می مانند، به نسل 1 ارتقا پیدا می کنند. اشیایی که در این نسل توسط  Garbage collection احیا می شوند، در نسل بعدی در حافظه باقی نمی مانند.

نسل1: شی هایی که با تناوب کمتری از نسل 0 جمع آوری می شوند وشامل اشیای longer-lived هستند که از نسل پیش ارتقا پیدا کرده اند. شی هایی که در حافظه باقی می مانند در این نسل به نسل بعدی ارتقا پیدا می کنند.

نسل2: شی های longest-lived هستند که از نسل پیش ارتقا یافته اند و به ندرت جمع  آوری می شوند. استراتژی کلیgarbage collector جمع آوری و حرکت دادن شی های  longer-lived با تناوب کمتر می باشد.

Garbage Collector منابع مدیریت شده را به طور اتوماتیک پاک می کند، زیرا کدهای مدیریت شده به طور مستقیم  توسط CLR قابل دسترسی اند. اما زمانی که یک شی از منابع  unmanaged مانند اتصالات دیتا بیس و یا دستکاری فایل استفاده میکند، باید دستی آزاد شوند و این به وسیله ی متد finalize امکان پذیر می باشد.

ما از متد destructor بااستفاده ازعلامت (~) که درکدمان وارد می کنیم، می توانیم شی را از بین ببریم و این destructor به متد finalize  تبدیل می شود (در کد کامپایل شده چک کنید). این به عنوان یک فرآیند نهایی شناخته می شود.زمانی که ما در حال پیاده سازی متد ()Finalize هستیم هیچ کنترلی روی این متد نداریم. در فرایند نهایی دو چرخه جمع آوری (Collection) وجود دارد که حافظه ی شی را به طور کامل آزاد می کند.در طول اولین collection، شی برای finalization نشانه گذاری می شود .زمانی که finalization انجام شد، garbage collector  حافظه ی شی را پس می گیرد وحافظه آزاد می شود.

متددیگری به نام ()Dispose وجوددارد که منابع managed (مدیریت شده) و منابع unmanaged (مدیریت نشده) را به طور صریح آزاد می کند.این متد تنها متدی که در یک IDisposable interface می باشد وقابل استفاده برای آزاد کردن منابع مدیریت نشده به صورت دستی می باشد.

آموزش سی شارپ

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 2k بازدید
  • 3 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید