💎 حافظه استک
🔆 حافظه استک در واقع فضاییست که به اجرا شدن توابع، داده های نوع پیشین، متغیر های محلی و متغیر های مرجع موجود در توابع اختصاص داده شده است. دسترسی به حافظه استک بصورت خروج به ترتیب عکس ورود یا Last in First Out میباشد. هر متدی که اجرا میشود در حافظه استک یک بلاک حافظه به آن اختصاص داده میشود و هر داده پیشین و ارجاع به آبجکت های موجود در بدنه متد، در این بلاک حافظه ذخیره میشود. وقتی متد بصورت کامل اجرا میشود، بلاک حافظه از حافظه استک حذف و این حافظه برای استفاده مجدد در دسترس قرار میگیرد. عمر مقادیر و داده های موجود در حافظه استک وابسته به زمان اجرای متدی است که این مقادیر را در حافظه ایجاد کرده است.
طول حافظه استک ثابت میباشد و بعد از ایجاد شدن قابل تغییر نیست. خطای استک اور فلو (سر ریز پشته) نیز زمانی که استک پر شده باشد رخ میدهد. یعنی دقیقا زمانی که هیچ حافظه ای برای اجرا شدن متد بعدی وجود نداشته باشد. برای مثال وقتی که یک متد بازگشتی بی نهایت بار خودش را صدا بزند:
public static int recursiveFunc(){
return recursiveFunc();
}
#Stack #Stack_Memory #Memory
———
☕️@PieceJava
🔆 حافظه استک در واقع فضاییست که به اجرا شدن توابع، داده های نوع پیشین، متغیر های محلی و متغیر های مرجع موجود در توابع اختصاص داده شده است. دسترسی به حافظه استک بصورت خروج به ترتیب عکس ورود یا Last in First Out میباشد. هر متدی که اجرا میشود در حافظه استک یک بلاک حافظه به آن اختصاص داده میشود و هر داده پیشین و ارجاع به آبجکت های موجود در بدنه متد، در این بلاک حافظه ذخیره میشود. وقتی متد بصورت کامل اجرا میشود، بلاک حافظه از حافظه استک حذف و این حافظه برای استفاده مجدد در دسترس قرار میگیرد. عمر مقادیر و داده های موجود در حافظه استک وابسته به زمان اجرای متدی است که این مقادیر را در حافظه ایجاد کرده است.
طول حافظه استک ثابت میباشد و بعد از ایجاد شدن قابل تغییر نیست. خطای استک اور فلو (سر ریز پشته) نیز زمانی که استک پر شده باشد رخ میدهد. یعنی دقیقا زمانی که هیچ حافظه ای برای اجرا شدن متد بعدی وجود نداشته باشد. برای مثال وقتی که یک متد بازگشتی بی نهایت بار خودش را صدا بزند:
public static int recursiveFunc(){
return recursiveFunc();
}
#Stack #Stack_Memory #Memory
———
☕️@PieceJava
👍10
💎 حافظه هیپ
حافظه هیپ در ذخیره آبجکت های ایجاد شده در زمان اجرای یک برنامه جاوا بسیار موثر است. البته مسیر ارجاع به آبجکت ایجاد شده همچنان در حافظه استک ذخیره میشود که به همان آبجکت ایجاد شده در حافظه هیپ اشاره میکند. حافظه هیپ در مقایسه با حافظه استک، فضای خیلی بزرگتری در اختیار دارد. در حافظه هیپ ابجکت های بلااستفاده توسط گاربیج کالکتور برای ازاد سازی حافظه حذف میشوند.
🔗 درباره گاربیج کالکشن از اینجا بخوانید
🔆 تقسیم بندی حافظه هیپ
حافظه هیپ به سه بخش تقسیم میشود: نسل جدید، نسل قدیم و نسل دائمی.
🔅نسل جدید
نسل جدید بخشی است که به آبجکت های تازه ایجاد شده اختصاص داده میشود. نسل جدید نیز به سه بخش Eden و Survivor 1 و Survivor 2 تقسیم میشود. در ابتدا تمامی آبجکت ها در داخل حافظه Eden قرار گرفته میشوند. پس از پر شدن حافظه Eden، یک گاربیج کالکشن جزئی اتفاق می افتد تا آبجکت های بلااستفاده از سطح حافظه حذف شوند. در این حالت آبجکت های باقیمانده به بخش Survivor 1 و سپس به بخش Survivor 2 انتقال میابند.
🔅نسل قدیم
در ادامه آبجکت های باقیمانده به بخش نسل قدیم انتقال می یابند. در این بخش معمولا کمی از ابجکت ها دوباره توسط گاربیج کالکشن جمع اوری میشوند تا این اطمینان حاصل شود که در این بخش فقط ابجکت های ماندگار وجود دارند.
🔅نسل دائمی
در این بخش JVM برای ذخیره متادیتا (فراداده) در مورد کلاس ها و متد ها استفاده میکند. البته یک نظر اینجا وجود دارد که بیان میکند نسل دائمی جزئی از حافظه هیپ نیست و به یک بخش دیگر اختصاص دارد.
🚫 استثنای OutOfMemoryError
اگر یک ابجکت وجود داشته باشد که فضایی بیشتر از فضای موجود در حافظه هیپ در بر داشته باشد، استثنای OutOfMemoryError رخ خواهد داد. برای مثال:
public class ITHooloo {
public static void main(String[] args) {
int[] array = new int[1000*1000*1000];
}
}
🔗درباره حافظه استک از اینجا بخوانید
#Heap_Memory #Memory #Heap
———
☕️ @PIECEJAVA
حافظه هیپ در ذخیره آبجکت های ایجاد شده در زمان اجرای یک برنامه جاوا بسیار موثر است. البته مسیر ارجاع به آبجکت ایجاد شده همچنان در حافظه استک ذخیره میشود که به همان آبجکت ایجاد شده در حافظه هیپ اشاره میکند. حافظه هیپ در مقایسه با حافظه استک، فضای خیلی بزرگتری در اختیار دارد. در حافظه هیپ ابجکت های بلااستفاده توسط گاربیج کالکتور برای ازاد سازی حافظه حذف میشوند.
🔗 درباره گاربیج کالکشن از اینجا بخوانید
🔆 تقسیم بندی حافظه هیپ
حافظه هیپ به سه بخش تقسیم میشود: نسل جدید، نسل قدیم و نسل دائمی.
🔅نسل جدید
نسل جدید بخشی است که به آبجکت های تازه ایجاد شده اختصاص داده میشود. نسل جدید نیز به سه بخش Eden و Survivor 1 و Survivor 2 تقسیم میشود. در ابتدا تمامی آبجکت ها در داخل حافظه Eden قرار گرفته میشوند. پس از پر شدن حافظه Eden، یک گاربیج کالکشن جزئی اتفاق می افتد تا آبجکت های بلااستفاده از سطح حافظه حذف شوند. در این حالت آبجکت های باقیمانده به بخش Survivor 1 و سپس به بخش Survivor 2 انتقال میابند.
🔅نسل قدیم
در ادامه آبجکت های باقیمانده به بخش نسل قدیم انتقال می یابند. در این بخش معمولا کمی از ابجکت ها دوباره توسط گاربیج کالکشن جمع اوری میشوند تا این اطمینان حاصل شود که در این بخش فقط ابجکت های ماندگار وجود دارند.
🔅نسل دائمی
در این بخش JVM برای ذخیره متادیتا (فراداده) در مورد کلاس ها و متد ها استفاده میکند. البته یک نظر اینجا وجود دارد که بیان میکند نسل دائمی جزئی از حافظه هیپ نیست و به یک بخش دیگر اختصاص دارد.
🚫 استثنای OutOfMemoryError
اگر یک ابجکت وجود داشته باشد که فضایی بیشتر از فضای موجود در حافظه هیپ در بر داشته باشد، استثنای OutOfMemoryError رخ خواهد داد. برای مثال:
public class ITHooloo {
public static void main(String[] args) {
int[] array = new int[1000*1000*1000];
}
}
🔗درباره حافظه استک از اینجا بخوانید
#Heap_Memory #Memory #Heap
———
☕️ @PIECEJAVA
Telegram
کانال تیکه پاره های جاوا
♻️ مفهوم گاربیج کالکشن (Garbage Collection) در جاوا
🟡 گاربیج کالکشن (زباله روب) یک ویژگی جاوا برای مدیریت حافظه است. گاربیج کالکشن اشیا بلا استفاده در سطح حافظه را حذف میکند.
🔰 مثال زیر رو در نظر بگیرید:
Point blank = new Point(3, 4);
blank = null;
خط…
🟡 گاربیج کالکشن (زباله روب) یک ویژگی جاوا برای مدیریت حافظه است. گاربیج کالکشن اشیا بلا استفاده در سطح حافظه را حذف میکند.
🔰 مثال زیر رو در نظر بگیرید:
Point blank = new Point(3, 4);
blank = null;
خط…
❤11