راجب heap و stack و اینکه هر کدام از collection ها چطوری در heap و stack قرار میگیرند؟
در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.
این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .
در برنامهنویسی جاوا، دو ناحیه اصلی از حافظه برای ذخیره دادهها استفاده میشود: Heap و Stack. درک تفاوت بین این دو ناحیه و نحوه قرارگیری مجموعهها در آنها برای درک بهتر مدیریت حافظه و عملکرد برنامه بسیار مهم است.
Stack (پشته)
ویژگیها:FIFO (First In, First Out): دادهها به ترتیب وارد شدن و خارج شدن ذخیره میشوند. فضای محدود: اندازه Stack معمولاً نسبت به Heap کوچکتر است. محلی برای متغیرهای محلی: متغیرهای محلی یک متد، ارجاعات به اشیاء و دادههای اولیه در Stack ذخیره میشوند. خودکار: مدیریت Stack توسط کامپایلر به صورت خودکار انجام میشود.
نحوه قرارگیری مجموعهها:ارجاعات: خود مجموعه (مانند ArrayList، HashSet و ...) در Heap ذخیره میشود. متغیرهای محلی: اما متغیرهایی که به این مجموعهها اشاره میکنند (مانند ارجاعات به اشیاء) در Stack ذخیره میشوند.
Heap (پشته)
ویژگیها:Dynamic allocation: فضای مورد نیاز برای اشیاء به صورت پویا در زمان اجرا تخصیص داده میشود. فضای بزرگ: معمولاً بزرگترین ناحیه حافظه در یک برنامه است. Garbage collection: اشیاء بلااستفاده به طور خودکار توسط Garbage Collector از Heap حذف میشوند.
نحوه قرارگیری مجموعهها:اشیاء: خود اشیاء مجموعهها (مانند عناصر یک ArrayList) در Heap ذخیره میشوند. ساختار داده: ساختار داخلی مجموعه (مانند آرایه در ArrayList یا درخت در TreeMap) نیز در Heap قرار میگیرد.
خلاصه
Stack: برای متغیرهای محلی، ارجاعات به اشیاء و دادههای اولیه استفاده میشود.
Heap: برای اشیاء و ساختارهای دادهای بزرگتر استفاده میشود.
مثال خیلی ساده :
public class Main {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // ارجاع به ArrayList در Stack، خود ArrayList در Heap
list.add("Hello"); // رشته "Hello" در Heap، ارجاع به آن در Stack
}
}
در این مثال:
متغیر list از نوع ArrayList در Stack ذخیره میشود.
خود شیء ArrayList و رشته "Hello" در Heap ذخیره میشوند.
list یک ارجاع به آدرس شیء ArrayList در Heap است.
نکات مهم
اندازه Stack: اندازه Stack معمولاً محدود است و ممکن است باعث ایجاد خطای StackOverflowError شود اگر تعداد زیادی فراخوانی متد به صورت تو در تو انجام شود.
Garbage Collection:
مدیریت حافظه Heap به عهده خود برنامه نویس است اما در جاوا Garbage Collector نیز به طور خودکار اشیاء بلا استفاده را از heap حذف میکند.
انتخاب مجموعه مناسب: انتخاب نوع مجموعه (ArrayList، LinkedList، HashMap و ...) و نوع دادهها، به عملیات مورد نظر و محدودیتهای حافظه بستگی دارد.
درک این مفاهیم به شما کمک میکند تا برنامههای کارآمدتر و با مصرف حافظه کمتر بنویسید.