وبلاگ شخصی حامد شیربندی

حامد شیربندی

توسعه دهنده نرم افزار

آبجکت هایی که می سازیم چه میشوند؟ آشنایی با فضای Heap ، Stack و Static

دو نوع فضای نگهداری اطلاعات به اسم Heap و Stack در RAM وجود دارد. نوع Heap برای نگهداری اطلاعات dynamic و نوع Stack برای نگهداری داده های غیر dynamic

خود فضای Heap داری قسمتی به نام Static است که برای نگهداری انواع static در دات نت از آن استفاده میشود. یعنی زمانی که ما یک پراپرتی از نوع static تعریف میکنیم در این قسمت از Heap نگهداری میشود.

Stack در سطح Thread عمل میکند و مقادیر قرار داده شده در آن در سطح یک Thread در دسترس هستند اما Heap در سطح Application عمل کرده و داده های قرار گرفته در آن در سطح برنامه در دسترس هستند.

فضای Stack برای ذخیره سازی و دستیابی به اطلاعات از LIFO پیروی میکند یعنی همیشه آخرین عضو وارد شده، اولین عضو خارج شده خواهد بود.


آشنایی با فضای Heap ، Stack و Static

زمانی که اندازه ی اطلاعات قبل از کامپایل شدن برنامه برای ما مشخص باشد داریم از حافظه ی Stack استفاده میکنیم مثلا زمانی که می گوییم int x=99 دقیقا مشخص است که x چه مقدار فضا نیاز دارد اما زمانی که قبل از کامپایل نمیدانیم دقیقا چه مقدار فضا نیاز داریم، از حافظه ی Heap استفاده میشود چون در این مورد در زمان اجرا (Run Time) فضا به آبجکت ایجاد شده اختصاص می یابد مثلا زمانی که میگوییم ()MyClass myClass= new MyClass.

دسترسی به اطلاعات قرار گرفته در Heap اندکی کند تر از Stack است چرا که داده های مربوط به متغیر های قرار گرفته در Stack به صورت مستقیم در حافظه ذخیره شده و دسترسی به آنها بسیار سریع تر است.

وقتی یک متغیر را تعریف میکنیم چه اتفاقی در زمان اجرا رخ می دهد؟

وقتی یک متغیر در یک برنامه دات نت ایجاد میکنیم یک فضا در حافظه رزرو میشود که شامل سه چیز می باشد : نام متغیر ، نوع داده ای متغیر (data type) و مقدار متغیر (value)  اما با توجه به نوع داده ای آن متغیر است که محل ذخیره سازی آن در RAM انتخاب میشود.

برای درک بهتر این موضوع قطعه کد زیر را در نظر بگیرید:


public void MyMethod()
{
 // Line 1
 int i=4;

 // Line 2
 int y=2;

 //Line 3
 class1 cls = new MyClass();
}

زمانی که MyMethod صدا زده شود به تریتیب مراحل زیر انجام میشودند:

  • در خط اول بلافاصله یک فضا در Stack برای متغیر i در نظر گرفته شده و مقدار 4 در آن قرار میگیرد.
  • در خط دوم متغیر y نیز با مقدار 2 در stack درست بالای i قرار گرفته و اولویت واکشی آن بیشتر خواهد بود.
  • در خط سوم هم یک متغیر به اسم cls در فضای Stack ایجاد میشود اما از آنجایی که این یک آبجکت است و نوع داده ای آن نیز dynamic خواهد بود مقدار آن در حافظه ی Heap قرار گرفته و متغیر cls فقط به آدرس آن در Heap اشاره میکند  و در حقیقت فقط یک pointer خواهد بود.

حالا با انجام مراحل فوق و هنگام خارج شدن از متد MyMethod تمام فضاهای مربوط به آن از Stack پاک میشوند، یعنی i و y و cls. اما آبجکت ایجاد شده ی متناظر با cls در Heap از بین نمیرود و این موضوع به GC یا همان Garbage Collector در دات نت واگذار میشود تا این زباله ها را با توجه به اینکه اشاره کننده ای  (pointer) در Stack ندارند شناسایی کرده و از بین ببرد.

نکته ای که در مورد cls وجود دارد این است که تا زمانی که این متغیر new نشود هیچ مقداری در Heap برای آن در نظر گرفته نمیشود و مقدار آن در Stack نیز null خواهد بود.

برای درک بهتر این توضیحات تصویر زیر را بررسی کنید:

آبجکت هایی که می سازیم چه میشوند؟ آشنایی با فضای Heap ، Stack و Static

 

نوشته شده توسط حامد شیربندی

اگر در مورد این نوشته سوال یا ابهامی وجود دارد میتوانید به ایمیل من ارسال کنید. البته در این مورد باید کمی صبور باشید. در آینده بخش نظرات اضافه خواهد شد.