برنامه نویسی

چگونه جاوا داده ها را در حافظه ذخیره می کند: نوشتن کد کارآمد با بدوی و غیر پیش بینی ها

چگونه جاوا داده ها را در حافظه ذخیره می کند-Primitives در مقابل غیر مقدماتی

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

انواع ابتدایی در جاوا

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

نوع اندازه شرح
byte 1 بایت کوچکترین عدد صحیح (-128 تا 127)
short 2 بایت عدد صحیح
int 4 بایت نوع عدد صحیح پیش فرض
long 8 بایت عدد صحیح
float 4 بایت شناور تک دقیق
double 8 بایت شناور دوتایی
char 2 بایت شخصیت یکپارچه
boolean 1 بیت* درست یا نادرست (به عنوان 1 بایت داخلی انجام می شود)

توجه: اگرچه boolean از نظر مفهومی 1 بیت است ، معمولاً به عنوان ** 1 بایت ذخیره می شود* در حافظه به دلیل تراز و محدودیت های اجرای عملی.*

انواع غیر حساس (مرجع)

غیر پیش بینی ها ، همچنین خوانده می شوند انواع مرجع، پیچیده تر و در پشته، در حالی که منابع آنها (نشانگرها) در پشتهبشر این نوع شامل:

نوع شرح
String دنباله شخصیت ها (تغییر ناپذیر)
Arrays مجموعه سفارش داده شده (از هر نوع ، از جمله بدوی)
Class اشیاء تعریف شده سفارشی
Interface انواع انتزاعی که کلاسهای دیگر اجرا می کنند
Enum مجموعه ثابت ثابت (کلاس داخلی)
Wrapper بازنمایی شیء از انواع بدوی (به عنوان مثال ، Integerبا Double)
Collections ساختار داده مانند Listبا Setبا Map، و غیره (بخشی از چارچوب مجموعه های جاوا)

چگونه جاوا داده ها را در حافظه ذخیره می کند

جاوا مدیریت حافظه را با مجموعه زباله های اتوماتیک، اما در اینجا نحوه عملکرد آن در زیر کاپوت آورده شده است:

حافظه پشته

  • فروشگاه تماس های روشبا متغیرهای محلیوت انواع بدویبشر
  • دسترسی سریع به دلیل ساختار LIFO.
  • پس از خروج یک روش ، حافظه به طور خودکار آزاد می شود.

حافظه پشته

  • فروشگاه اشیاء وت مقادیر غیر حساسبشر
  • دسترسی از طریق منابع ذخیره شده در پشته.
  • مدیریت شده توسط جمع کننده زباله (GC).
  • بزرگتر و کندتر از پشته اما می تواند ساختارهای پویا و پیچیده را ذخیره کند.

به انواع ابتدایی دسترسی پیدا می شود

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

چگونه به غیر پیش بینی ها دسترسی پیدا می شود

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

مثال:

String name = "John";
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  • name (پشته) → به "John" (پشته)

اگر تغییر کنیم name = "Jack";، حالا name به یک جدید اشاره می کند "Jack" در پشته (زیرا String تغییر ناپذیر است)

تراز حافظه و بهینه سازی JVM

جاوا با اصل طراحی شده است: “یک بار بنویسید ، در هر کجا اجرا کنید”، این بدان معنی است که JVM باید روی هر دو کار کند CPU های 32 بیتی و 64 بیتیبشر

استراتژی تراز JVM:

  • صرف نظر از نوع اعلام شده ، JVM حافظه را به تکه های 4 بایت یا 8 بایت بستگی به CPU دارد.
  • عملیات در انواع کوچکتر (byteبا short) هستند تبدیل به int داخلی

چرا این است؟

  • byte 25 ٪ از بلوک 4 بایت را می گیرد. short 50 ٪ طول می کشد
  • CPU نیاز دارد مراحل اضافی برای محاسبه جبران خسارت و تراز کردن بلوک حافظه.
  • int کل بلوک 4 بایت را مصرف می کند ، ذخیره سازی و بازیابی سریعتربشر

به همین دلیل است:

JVM تبلیغ می کند byte وت short به int در طول محاسبات و نیاز به بازیگران صریح برای ذخیره نتایج.

تصور غلط: استفاده از byte/short حافظه را ذخیره می کند؟

چرا byte وت short هستند کارآمدتر:

  • JVM با آنها رفتار می کند int داخلی
  • اضافه کردن بالای سر در طول حسابی و دسترسی.
  • معرفی کردن تبدیل های پنهان (گسترش و باریک شدن).
  • کندتر به دلیل سوء استفاده از حافظه و ناکارآمدی CPU.

برای عملکرد و تراز کردن ، استفاده کردن int به عنوان پیش فرض برای اعداد صحیح

در مورد کلاس های بسته بندی چطور؟

کلاس های بسته بندی (Integerبا Double، و غیره) هستند نسخه های عینی از انواع ابتدایی

  • مانند هر شیء در پشته ذخیره می شود.
  • مورد استفاده در مجموعه ها (به عنوان مثال ، Listنه List)
  • روشهای ابزار مانند parseIntبا compareTo، و غیره

توجه: جعبه خودکار و جعبه جعبه به طور خودکار اتفاق می افتد:

int a = 10;
Integer b = a; // auto-boxing
int c = b;     // unboxing
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

بوکس اضافه می کند حافظه و عملکرد سربار، بنابراین از بوکس غیر ضروری در مسیرهای کد بحرانی خودداری کنید.

غذای اصلی

  • انواع بدوی اندازه ثابت و سریع ، در پشته ذخیره می شوند.
  • غیر مقدماتی در پشته با مرجع در پشته ذخیره می شوند.
  • JVM استفاده می کند int به عنوان پایه برای همه عملیات انتگرال کوچکتر.
  • از استفاده خودداری کنید byte وت short برای بهینه سازی، به دلیل پردازش پنهان ، آتش سوزی می کند.
  • کلاس های بسته بندی به بالای سر شیء اضافه می کنند. بدوی ها را ترجیح دهید برای مسیرهای بحرانی عملکرد.
  • جاوا دست زدن به حافظه را چکیده می کند ، اما درک این امر به شما در نوشتن کد کارآمدتر کمک می کندبشر

نوشته های مشابه

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

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

دکمه بازگشت به بالا