صفحه نخست --> توسعه نرم افزار --> حافظه 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 را نمایش میدهد.

$ java -X

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

$ java -X

-Xmixed           mixed mode execution (default)
-Xint             interpreted mode execution only
-Xbootclasspath:  set search path for bootstrap classes and resources -Xbootclasspath/a:append to end of bootstrap class path -Xbootclasspath/p:                   prepend in front of bootstrap class path -Xnoclassgc       disable class garbage collection -Xloggc:    log GC status to a file with time stamps
-Xbatch           disable background compilation
-Xms              set initial Java heap size
-Xmx              set maximum Java heap size
-Xss              set java thread stack size
-Xprof            output cpu profiling data
-Xfuture          enable strictest checks, anticipating future default
-Xrs              reduce use of OS signals by Java/VM (see documentation)
-Xdock:name=      override default application name displayed in dock -Xdock:icon=override default icon displayed in dock -Xcheck:jni       perform additional checks for JNI functions -Xshare:off	      do not attempt to use shared class data -Xshare:auto      use shared class data if possible (default) -Xshare:on	      require using shared class data, otherwise fail.  The -X options are non-standard and subject to change without notice.
 

دستور زیر به منظور دیدن فضای حافظه 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
برای ورود به کانال بر روی اینجا کلیک کنید.

پاسخ دهید