ساختار حافظه در برنامه های مبتنی بر دات نت
بدون دیدگاه
در حال حاضر خالی است: ۰ ﷼
درک ساختار حافظه در برنامه های مبتنی دات نت اهمیت بسیار بالایی دارد. به عنوان یک برنامه نویس باید تقسیم بندی Data Memory را خوب درک کنید. این مطلب به شما کمک می کند بتوانید انواع داده ها، اعم از Reference Type و Value Type ها را به خوبی بشناسید. برای برنامه های مبتنی بر دات نت دو بخش در Data Memory برای نگهداری داده ها و متغییر ها در نظر گرفته شده است. دات نت Application Data Memory را به دو بخش Stack و Heap تقسیم کرده و هر بخش خصوصیات مربوط به خود را دارد.
Stack بخش کوچکتری از حافظه به نسبت Heap میباشد. به آن دسترسی مستقیم داریم و ساختار آن از نوع LIFO میباشد. (برای اطلاعات بیشتر می توانید مطلب: حافظه های LIFO و FIFO – کاربردها و تفاوتها را مطالعه نمایید). فضای خالی این حافظه برای اجرای برنامه بسیار اهمیت دارد. بنابراین برای نگهداری داده هایی با حجم کم و استفاده موقتی مناسب میباشد.
متغییر های تعریف شده (چه Reference Type و چه Value Type) در این بخش از حافظه نگداری میشوند. به مثال زیر توجه کنید. در این تصویر فضا های حافظه مشحص شده و تعریف و مقدار دهی اولیه یک متغییر از نوع Value Type در آن نمایش داده شده است:
دقت کنید این الزاما به معنی وجود دیتای مترادف این متغییر ها در Stack نمیباشد. مقدار متغییر های Value Type نیز در Stack نگهداری میشوند. ولی دیتای اشیاء ساخته شده از انواع Reference Type نیاز به فضای بیشتری دارد. از آنجا که این اشیاء قابلیت استفاده مجدد دارند، نمیتوان آنها را در Stack نگهداری کرد. بنابراین به فضای بیشتری از حافظه که مجزا از Stack باشد برای این کار نیاز داریم. این فضا توسط بخشی به نام Heap تامین میشود.
Heap فضایی بزرگتر از Stack میباشد. به این فضا دسترسی مستقیم نداریم. مدیریت حافظه Heap بر عهده دات نت میباشد. اشیاء ساخته شده از نوع Reference Type در این بخش از Application Data Memory نگهداری میشوند. بخشی از دات نت به نام Garbage Collection وظیفه آزاد کردن فضاهای بلااستفاده در Heap را به عهده دارد. (برای آشنایی بیشتر با اجزاء اصلی دات نت، مطلب: دات نت چیست و چگونه عمل می کند را مطالعه نمایید)
وقتی متغییری از نوع Reference Type تعریف میشود، فضایی در Stack به متغییر اختصاص مییابد. سپس حین نمونه سازی، شیء جدید در Heap ایجاد شده و آدرس آن بخش از Heap در متغییر مترادف (در Stack) قرار میگیرد. به این صورت عملا ما به آدرس شیء ساخته شده دسترسی داریم. به مثال زیر توجه کنید:
در این مثال، ابتدا متغییر تعریف شده و سپس نمونه سازی انجام میشود. نمونه ای از کلاس Person در Heap ساخته شده و آدرس آن در متغییر P در Stack قرار میگیرد. دسترسی به اشیاء موجود در Heap به روش غیر مستقیم و با کمک آدرس یا Reference آنها ممکن است.