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

چگونه جاوا داده ها را در حافظه ذخیره می کند-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 دقیقاً می داند که چه مقدار حافظه برای تخصیص و بازیابی دارد.
چگونه به غیر پیش بینی ها دسترسی پیدا می شود
- هنگامی که یک غیرقانونی ایجاد می شود ، مرجع (آدرس حافظه) در پشته ذخیره می شود.
- در شیء واقعی در پشته ذخیره می شود.
- دسترسی به جسم شامل می شود به دنبال مرجع از پشته تا پشته.
مثال:
String name = "John";
-
name(پشته) → به"John"(پشته)
اگر تغییر کنیم name = "Jack";، حالا name به یک جدید اشاره می کند "Jack" در پشته (زیرا String تغییر ناپذیر است)
تراز حافظه و بهینه سازی JVM
جاوا با اصل طراحی شده است: “یک بار بنویسید ، در هر کجا اجرا کنید”، این بدان معنی است که JVM باید روی هر دو کار کند CPU های 32 بیتی و 64 بیتیبشر
استراتژی تراز JVM:
- صرف نظر از نوع اعلام شده ، JVM حافظه را به تکه های 4 بایت یا 8 بایت بستگی به CPU دارد.
- عملیات در انواع کوچکتر (
byteباshort) هستند تبدیل بهintداخلی
چرا این است؟
-
byte25 ٪ از بلوک 4 بایت را می گیرد.short50 ٪ طول می کشد - 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برای بهینه سازی، به دلیل پردازش پنهان ، آتش سوزی می کند. - کلاس های بسته بندی به بالای سر شیء اضافه می کنند. بدوی ها را ترجیح دهید برای مسیرهای بحرانی عملکرد.
- جاوا دست زدن به حافظه را چکیده می کند ، اما درک این امر به شما در نوشتن کد کارآمدتر کمک می کندبشر



