حافظه هیپ (Heap) و استک (Stack) در برنامه نویسی.





انواع حافظه

Heap and stack
Heap and stack



دونوع حافظه داریم حافظه استک (Stack) که در درس ساختمان داده در رشته کامپیوتر به آن پشته میگویند. و حافظه هیپ (Heap).

در برنامه نویسی ما همیشه با حافظه استک سروکار داریم حتی اگر متغیر ما رفرنس تایپ باشد.




پشته یا استک چیست؟ Stack

حافظه استک در برنامه نویسی برای نگه داری مقدار متغیرها (متغیرهای ولیو تایپ) میباشد و در زمانی که شما یک متد را فراخوانی میکنید، آن متد درون این حافظه ذخیره میشود و سپس متغیر های درون متد.

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

بنابراین موقع برداشتن وسایل اولین وسیله ای که برمیداری آخرین وسیله ای است که درون استوانه گذاشته اید.

پشته هم به همین شکل است.

اولین شئ که برمیدارید آخرین شئ است که گذاشته اید
اولین شئ که برمیدارید آخرین شئ است که گذاشته اید




حالا چه موقع استفاده میشه؟

شما وقتی متدی را صدا میزنید آن متد در انتهای استوانه قرار میگرد و متغیرهای آن بر روی آن سوار میشد و اگر متد دیگری را صدا بزنید درون آن متد، دوباره درون پشته ذخیره میشود و بر روی تمام متغیرهای متد قبلی جای میگیرد.

و تا زمانی که کارتان با متد تمام نشود، آن متد از حافظه استک خارج نمیشود.

در حافظه استک همانطور که گفتم دیتاها و مقادیر ذخیره میشود، مقادیر متغیرهایی که ولیو تایپ باشن، مثله int, float و کلاً متغیرهای عددی و شما میتوانید مقادیر این متغیر هارا به راحتی در جای دیگه ریخته و تغییر دهید در صورتی که مقدار اصلی تغییر نکند.

اما بعضی از نوع های متغیر مثله لیست‌ها و کلاس ها ولیو تایپ نیستن و رفرنس تایپن که در ادامه به اینها خواهیم پرداخت.

شما در برنامه نویسی نیازی به مدیریت استک ندارید و فقط کافیه که مدیریت کنید که یک متد را چه زمانی کال کنید و چه زمانی آن را خاطمه دهید، همچنین باید مراقبه توابع بازگشتی باشین چون این نوع توابع درصورت تکرار زیاد میتوانند باعث پر شدنه حافظه استک شود و به خطای استک اوورفلو (Stack overflow) دچار شوید.



حافظه رفرنس تایپ و یا Heap:

این نوع حافظه مربوط به متغیرهایی میشوند که ولیو تایپ نیتسن بلکه رفرنس تایپن.

سرعت پایین تری دارن و در صورت مدیریت نکردن آنها باعث کند شدن سیستم میشوند.

رفنرنس تایپ ها عبارت اند از متغیرهای آرایه ای، کلاس ها و اشیا.

همچنین متغیر های رشته‌ای نیز جزوه رفرنس تایپ ها به حساب می آیند.

در Ram بخشی وجود دارد به نام حافظه داینامیک که هیپ و متغیرهای رفرنس تایپی در آنجا ذخیره میشوند.

این حافظه بدین شکل کار میکند که مقدار متغیر را ممکن است در یک بلوک و یا بلوک های جدا از هم ذخیره کند و در نهایت رفنرس و یا آدرس آن را در حافظه استک ذخیره کند.

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

این حافظه در صورت سنگین شدن ممکن است باعث متوقف شدن برنامه شما شود چرا که دیگر فضایی برای ذخیره سازی متغیرهای دیگر نیستش.

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

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

حالا در اینجا بحثی بوجود می آید به نام garbage collection که کارش این میباشد، متغیرهای بلا استفاده را از حافظه استک پاک میکند.

این کار باعث آزاد سازی فضای هیپ شده و در نتیجه باعث افزایش سرعت سایت شما میشود.

حافظه هیپ و استک
حافظه هیپ و استک