خانه --> توسعه نرم افزار --> حافظه heap, Stack, Xmx, Xms, Xss در جاوا

حافظه heap, Stack, Xmx, Xms, Xss در جاوا

فهم درست از حافظه هیپ (heap) و استک (Stack) در ماشین مجازی جاوا می تواند درک ما را از اجرای برنامه های جاوا بیشتر نماید. در این مبحث به توضیحاتی مختصر در مورد حافظه heap, Stack, XMX, XMS در جاوا می پردازیم.

Guest OS Memory: بعد از فعال شدن JVM همیشه بخشی از حافظه همیشه در اختیار سیستم عامل مهمان یا مجازی جاوا است. بعد از اجرای JVM بخش دیگری از حافظه در اختیار JVM قرار میگیرد که شامل دوبخش Stack و heap است.

حافظه استک (Stack) : حافظه Stack یا پشته مثل دسته ای از بشقاب هستش که روی هم قرار گرفتن… هروقت بخواهید بشقابی روی دسته بشقاب ها قرار بدید(Push) معمولاً اون رو در بالا قرار میدید. به همین ترتیب هروقت بخواهید بشقابی از این دسته بردارید(Pop) همیشه بشقاب بالایی رو برمیدارید… که این دسته رو Stack هه LIFO یا همون LastIn-FirstOut می نامند.

بر اساس تعاریف JVM، هر زمانی که یک ریسمان (Thread) شروع به کار می‌کند، حافظه‌ای به آن تخصص داده می‌شود که که بهش Stack گفته می‌شود. این حافظه متغیر‌ها محلی و نتایج محلی مربوط به ریسمان را در خودش نگه می‌دارد. برای تعیین مقادیر این حافظه از کلید‌های Xss برای ترد ها و XX:MaxPermSize برای توابع استفاده می‌شود. این حافظه در فراخوانی متد‌ها هم مورد استفاده قرار می‌گیرد. هنگامی که ریسمان جدیدی درحال اجرا باشد، یا محاسبات ریسمانی نیاز به حافظه‌ی بیشتر داشته باشه و حد حافظه این امکان رو ندهد، خطایی که پرتاب می‌شه، StackOverflowError هست. حافظه stack در جاوا نیز شامل دوبخش است: method area (-XX) و native area (-Xss) که در ادامه بررسی میشوند.

حافظه heap, Stack, XMX, XMS در جاوا
حافظه heap, Stack, XMX, XMS در جاوا
  • method area (-XX):

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

  • native area (-Xss):

 فضای اختصاصی ترد ها (java thread stack size) نگهداری میشود.

حافظه Heap: هنگامی که در جاوا یکی شی جدید به وجود می آید یا به عبارت دیگر هنگام استفاده از کلمه کلیدی new در جاوا، یک ناحیه در Heap برای شی ایجاد شده، در نظر گرفته می شود. متغیر های Private درون بلاک کلاس نیز در heap ذخیره می شوند. در صورتی که در هنگام محاسبات نیاز به حافظه‌ی بیشتر از حد مجاز باشد و از طرفی امکان تخصیص وجود نداشته باشد، خطایی به نام OutOfMemoryError دیده می‌شود.بصورت پیش فرض این مقدار maximum برابر ۶۴ Mb است ولی می توان با استفاده از پارامتر -Xmx آن را تغییر داد. حافظه Heap نیز شامل دو بخش زیر است:

  • initial heap (Xms):   ماشین مجازی جاوا یک فضای اولیه برای حافظه Heap در نظر می گیرد که می توان این مقدار را با استفاده از پارامتر -Xms مشخص کرد.
  • Jvm Max Heap (-Xmx): در صورتی که JVM نیاز به فضای حافظه Heap بیشتری داشته باشد، JVM بصورت خودکار حافظه Heap را افزایش می دهد و می تواند آن را تا مقدار maximum مورد نظر بالا ببرد.

حافظه Heap شامل کد برنامه، مثل مقدار درون رفرنس ها یا به عبارتی  اشیاء که رفرنس آنها در استک قرار دارد،  توابع، فیلد ها و داده های استاتیک می باشد. این قسمت از حافظه است که توسط آشغال جم کنم جاوا به صورت خودکار پاک سازی میشوند. در JRE 32bit ، تنها از ۲GB حافظه پشتیبانی می شود که از این مقدار تنها ۱GB از آن برای Heap قابل مقدار دهی است. (که این مقدار وابسته به سیستم عامل ممکن است حتی تا ۵۱۲MB نیز کم شود. زمانی که خطای Invalid maximum heap size رخ می دهد بدین معنی است که مقدار حافظه heap درخواستی در حال حاضر برای تخصیص به JVM موجود نیست (سیستم عامل حافظه رم کافی ندارد).

دستور مقابل پارامتر های حافظه JVM را نمایش میدهد.

خروجی دستور فوق:

دستور زیر به منظور دیدن فضای حافظه heap, Stack, XMX, XMS در جاوا اختصاص یافته  بکار میرود.

 java -XX:+PrintFlagsFinal -version | grep -iE ‘HeapSize|PermSize|ThreadStackSize’

خروجی دستور فوق:

به منظور در اختیار دادن حافظه مورد نظر به یک برنامه جاوایی از روش دستور دهی زیر استفاده می کنیم:

$ java -Xss512k JavaApp

 

حافظه heap, Stack, XMX, XMS در جاوا
حافظه heap, Stack, XMX, XMS در جاوا

آدرس کانال تلگرام سایت بیگ دیتا:

t.me/bigdata_channel

آدرس کانال سروش ما:
https://sapp.ir/bigdata_channel

جهت دیدن سرفصل های دوره های آموزشی بر روی اینجا کلیک کنید.

جهت ثبت نام در دوره های آموزشی بر روی اینجا کلیک کنید.

 

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *