صادق خانزادی
صادق خانزادی
خواندن ۳ دقیقه·۴ ماه پیش

Heap and Stack in Java

راجب heap و stack و اینکه هر کدام از collection ها چطوری در heap و stack قرار میگیرند؟

در این مقاله فرض میکنیم که شما اطلاعات حدودی از Java Collections دارید.

این سلسله مقالات که برای تکمیل مقاله Java Collections - Everything You MUST Know نوشته شده برای بهبود و درک بهتر collectionها و مواردی که به طور روزمره دارید استفاده میکنید نوشته شده لطفا تمام این دسته بندی رو برای درک بهتر مطالعه کنید .

Mutable VS Immutable in java

StringBuilder vs StringBuffer vs String

Integer vs int

HashMap vs TreeMap vs Set

Heap And Stack

Memory Heap vs Memory Leak

Integer Constant Pool

Integer Pool vs String Pool

Ternary Operator

Autoboxing




در برنامه‌نویسی جاوا، دو ناحیه اصلی از حافظه برای ذخیره داده‌ها استفاده می‌شود: 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(&quotHello&quot); // رشته &quotHello&quot در Heap، ارجاع به آن در Stack } }

در این مثال:

  • متغیر list از نوع ArrayList در Stack ذخیره می‌شود.
  • خود شیء ArrayList و رشته "Hello" در Heap ذخیره می‌شوند.
  • list یک ارجاع به آدرس شیء ArrayList در Heap است.

نکات مهم

  • اندازه Stack: اندازه Stack معمولاً محدود است و ممکن است باعث ایجاد خطای StackOverflowError شود اگر تعداد زیادی فراخوانی متد به صورت تو در تو انجام شود.
  • Garbage Collection:

مدیریت حافظه Heap به عهده خود برنامه نویس است اما در جاوا Garbage Collector نیز به طور خودکار اشیاء بلا استفاده را از heap حذف میکند.

  • انتخاب مجموعه مناسب: انتخاب نوع مجموعه (ArrayList، LinkedList، HashMap و ...) و نوع داده‌ها، به عملیات مورد نظر و محدودیت‌های حافظه بستگی دارد.

درک این مفاهیم به شما کمک می‌کند تا برنامه‌های کارآمدتر و با مصرف حافظه کمتر بنویسید.


منتظر نگاه های زیباتون هستم .

موفق و پیروز باشید.

javastack and heap memorygarbage collectormemory leak
Java Developer - Technical Team Lead At Dotin
شاید از این پست‌ها خوشتان بیاید