جاوا | بررسی کامل حافظه Heap و Stack

جاوا | بررسی کامل حافظه Heap وStack

در یک کلام: حافظه Heap و Stack بترتیب برای ذخیره اشیا در سطح حافظه و مدیریت داده های محلی و ترتیب اجرای متد ها در جاوا کاربرد دارند.

💎حافظه استک

🔆 حافظه استک در واقع فضاییست که به اجرا شدن توابع، داده های نوع پیشین، متغیر های محلی و متغیر های مرجع موجود در توابع اختصاص داده شده است. دسترسی به حافظه استک بصورت خروج به ترتیب عکس ورود یا Last in First Out میباشد. هر متدی که اجرا میشود در حافظه استک یک بلاک حافظه به آن اختصاص داده میشود و هر داده پیشین و ارجاع به آبجکت های موجود در بدنه متد، در این بلاک حافظه ذخیره میشود. وقتی متد بصورت کامل اجرا میشود، بلاک حافظه از حافظه استک حذف و این حافظه برای استفاده مجدد در دسترس قرار میگیرد:

stack memory example

 

public class ITHooloo {
    public static void main(String[] args) {
        int x = 3;
        int fact = factorial(x);
    }
    public static int factorial(int number){
        if(number ==0)
            return 1;
        return number*factorial(number-1);
    }
}
💡عمر مقادیر و داده های موجود در حافظه استک وابسته به زمان اجرای متدی است که این مقادیر را در حافظه ایجاد کرده است.

🚫استثنای StackOverFlow

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

public static int recursiveFunc(){
        return recursiveFunc();
}

استثنای StackOverFlow

🔆 حافظه هیپ

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

حافظه هیپ

♻️ مفهوم گاربیج کالکشن (Garbage Collection) در جاوا

🟡 گاربیج کالکشن (زباله روب) یک ویژگی جاوا برای مدیریت حافظه است. گاربیج کالکشن اشیا بلا استفاده در سطح حافظه را حذف میکند.

🔰 مثال زیر رو در نظر بگیرید:

Point blank = new Point(3, 4);
blank = null;

خط اول یک شی از کلاس Point ایجاد میکند. اما خط دوم این آدرس را عوض میکند و آن را به نال (هیچ) نسبت میدهد.

یکی از کلمات رزرو شده در جاوا کلمه null میباشد. نال مقدار پیشفرض هر شی ساخته شده در جاوا میباشد. در واقع نال به هیچ چیز اشاره نمیکند. (در مورد Null از اینجا بخوانید)

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

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

💡 گاربیج کالکشن یک روند خودکار است.

🔆 تقسیم بندی حافظه هیپ

حافظه هیپ به سه بخش تقسیم میشود: نسل جدید، نسل قدیم و نسل دائمی.

تقسیم بندی حافظه هیپ

🔅نسل جدید

نسل جدید بخشی است که به آبجکت های تازه ایجاد شده اختصاص داده میشود. نسل جدید نیز به سه بخش Eden و Survivor 1 و Survivor 2 تقسیم میشود. در ابتدا تمامی آبجکت ها در داخل حافظه Eden قرار گرفته میشوند. پس از پر شدن حافظه Eden، یک گاربیج کالکشن جزئی اتفاق می افتد تا آبجکت های بلااستفاده از سطح حافظه حذف شوند. در این حالت آبجکت های باقیمانده به بخش Survivor 1 و سپس به بخش Survivor 2 انتقال میابند.

🔅نسل قدیم

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

🔅نسل دائمی

در این بخش JVM برای ذخیره متادیتا (فراداده) در مورد کلاس ها و متد ها استفاده میکند. البته یک نظر اینجا وجود دارد که بیان میکند نسل دائمی جزئی از حافظه هیپ نیست و به یک بخش دیگر اختصاص دارد.

🚫 استثنای OutOfMemoryError

🚫 استثنای OutOfMemoryError

اگر یک ابجکت وجود داشته باشد که فضایی بیشتر از فضای موجود در حافظه هیپ در بر داشته باشد، استثنای OutOfMemoryError رخ خواهد داد. برای مثال:

public class ITHooloo {
    public static void main(String[] args) {
        int[] array = new int[1000*1000*1000];
    }
}

 

: OUTPUT

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at ITHooloo.main(ITHooloo.java:5)

Process finished with exit code 1
اشتراک گذاری:

مطالب زیر را حتما مطالعه کنید

دیدگاهتان را بنویسید