يصف المثال الموجود في هذه المقالة كيفية حساب (أو تقدير) مقدار الذاكرة التي يشغلها كائن Java. شاركها مع الجميع لتكون مرجعا لك. التحليل المحدد هو كما يلي:
عادةً ما نتحدث عن استخدام ذاكرة الكومة في سياق "الحالات العامة". لا يتم تضمين الحالتين التاليتين:
في بعض الحالات، لا يقوم JVM بوضع الكائن في الكومة على الإطلاق. على سبيل المثال: من حيث المبدأ، يوجد كائن مؤشر ترابط محلي صغير على المكدس، وليس في الكومة.
يعتمد مقدار الذاكرة التي يشغلها الكائن على الحالة الحالية للكائن. على سبيل المثال: ما إذا كان قفل مزامنة الكائن ساري المفعول، أو ما إذا كان الكائن قيد إعادة التدوير.
دعونا أولاً نلقي نظرة على الشكل الذي يبدو عليه كائن واحد في الكومة.
في الكومة، يتكون كل كائن من أربعة حقول (A، B، C، D).
ج: رأس الكائن، الذي يشغل عددًا قليلاً جدًا من البايتات ويعبر عن معلومات حول الحالة الحالية للكائن.
ب: المساحة التي تشغلها حقول النوع الأساسي (تشير الحقول الأصلية إلى int، وboolean، وshort، وما إلى ذلك)
C: المساحة التي تشغلها حقول نوع المرجع (تشير حقول نوع المرجع إلى مراجع لكائنات أخرى، ويشغل كل مرجع 4 بايت)
د: المساحة التي يشغلها الحشو (سيتم شرح ما هو الحشو لاحقًا)
نوضح أدناه أ، ب، ج، د واحدًا تلو الآخر
ج: رأس الكائن
في الذاكرة، المساحة الإجمالية التي يشغلها كل كائن لا تتضمن فقط المساحة المطلوبة للمتغيرات المعلنة داخل الكائن، ولكنها تتضمن أيضًا بعض المعلومات الإضافية، مثل رؤوس الكائنات ومواد الحشو. وظيفة "رأس الكائن" هي تسجيل اسم المثيل والمعرف وحالة المثيل للكائن (على سبيل المثال، ما إذا كان المثيل الحالي "قابلاً للوصول"، أو حالة القفل الحالي، وما إلى ذلك).
في إصدار JVM الحالي (نقطة الاتصال)، يكون عدد البايتات التي يشغلها "رأس الكائن" كما يلي:
كائن عادي، يحتل 8 بايت
المصفوفة، تشغل 12 بايت، بما في ذلك 8 بايت + 4 بايت من الكائنات العادية (طول المصفوفة)
ب: النوع الأساسي
تشغل القيمة المنطقية والبايت 1 بايت، وتشغل char والقصيرة 2 بايت، وتشغل int وfloat 4 بايت، وتشغل الطويلة والمزدوجة 8 بايت
ج: النوع المرجعي
يحتل كل نوع مرجع 4 بايت
د: حشو
في Hotspot، يتم حساب المساحة الإجمالية التي يشغلها كل كائن كمضاعفات 8. عندما تكون المساحة الإجمالية التي يشغلها الكائن (رأس الكائن + المتغيرات المعلنة) أقل من مضاعف 8، سيتم ملؤها تلقائيًا. ومع ذلك، يمكن تسمية هذه المساحات المملوءة بـ "الحشوات". دعونا نلقي نظرة على مثال محدد:
كائن فارغ (بدون أي متغيرات معلنة) يحتل 8 بايت --> رأس الكائن يحتل 8 بايت
الفئة التي تعلن عن متغير نوع منطقي واحد فقط تشغل 16 بايت --> رأس الكائن (8 بايت) + منطقي (1 بايت) + حشو (7 بايت)
الفئة التي تعلن عن 8 متغيرات من النوع المنطقي تشغل 16 بايت --> رأس الكائن (8 بايت) + منطقي (1 بايت) * 8
ستساعدنا الأمثلة المذكورة أعلاه على تعميق فهمنا لبرمجة Java.