Java Developer | digipay
Heap and Stack in Java
راجب heap و stack و اینکه هر کدام از collection ها چطوری در heap و stack قرار میگیرند؟

در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.
این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .
StringBuilder vs StringBuffer vs String
در برنامهنویسی جاوا، دو ناحیه اصلی از حافظه برای ذخیره دادهها استفاده میشود: 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 و ...) و نوع دادهها، به عملیات مورد نظر و محدودیتهای حافظه بستگی دارد.
درک این مفاهیم به شما کمک میکند تا برنامههای کارآمدتر و با مصرف حافظه کمتر بنویسید.
منتظر نگاه های زیباتون هستم .
موفق و پیروز باشید.
مطلبی دیگر از این انتشارات
Autoboxing in Java
مطلبی دیگر از این انتشارات
using JUnit5 and Mockito (coding and test)
مطلبی دیگر از این انتشارات
الگوی ساگا (Saga Pattern)