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

چگونه جاوا داده ها را در حافظه ذخیره می کند-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
داخلی
چرا این است؟
-
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
برای بهینه سازی، به دلیل پردازش پنهان ، آتش سوزی می کند. - کلاس های بسته بندی به بالای سر شیء اضافه می کنند. بدوی ها را ترجیح دهید برای مسیرهای بحرانی عملکرد.
- جاوا دست زدن به حافظه را چکیده می کند ، اما درک این امر به شما در نوشتن کد کارآمدتر کمک می کندبشر