1. نظرة عامة
سوف تقسم الجهاز الظاهري Java الذاكرة التي تمكنت منها إلى العديد من مجالات البيانات المختلفة في عملية تنفيذ برنامج Java. ستتضمن الذاكرة التي تديرها الجهاز الظاهري Java مناطق بيانات وقت التشغيل التالية ، كما هو موضح في الشكل أدناه:
تم شرح ما يلي في كل منطقة.
ثانياً ، يمكن اعتبار عداد برنامج برنامج البيانات <BR /> عداد البرنامج <BR /> مؤشرًا رقم سطر لرمز البايت الذي تم تنفيذه بواسطة مؤشر الترابط الحالي. في نموذج مفهوم الجهاز الظاهري ، يتمثل عمل مترجم العمل في تحديد تعليمات رمز البايت التي يجب تنفيذها عن طريق تغيير قيم عداد البرنامج. يجب أن تعتمد استرداد الخيط والوظائف الأساسية الأخرى على هذا العداد لإكماله.
في المقدمة متعددة ، من أجل السماح للموضوع بالعودة إلى موضع التنفيذ الصحيح ، لا يحتاج كل مؤشر إلى وجود برنامج مستقل.
عندما يتم تنفيذ الخيط هو طريقة Java ، يسجل هذا العداد عنوان تعليمات رمز بايت الجهاز الظاهري الذي يتم تنفيذه ؛
منطقة الذاكرة هذه هي المجال الوحيد الذي لا يحدد أي OutofMemoryError.
مكدس الجهاز الافتراضي Java
مكدس الجهاز الافتراضي Java هو أيضًا خاص ، ودورة حياتها هي نفس الخيوط. يصف مكدس الجهاز الظاهري نموذج الذاكرة الذي تم تنفيذه بواسطة طريقة Java: ستقوم كل طريقة بإنشاء إطار مكدس لتخزين الجداول المتغيرة المحلية ، وتشغيل المكدس ، والقوائم المرتبطة الديناميكية ، ومعلومات تصدير الطريقة ، إلخ. من عملية الاتصال حتى يتم استدعاء عملية الانتهاء ، فهي تتوافق مع عملية إدخال المكدس في مكدس الجهاز الظاهري إلى المكدس.
في الجدول المتغير المحلي ، يتم تخزين أنواع البيانات الأساسية المختلفة (Boolean ، Byte ، Char ، Short ، Float ، Long ، Double) ، مراجع الكائنات وأنواع Returnaddress في المترجم.
إذا لم تتمكن من التقدم بطلب للحصول على ذاكرة كافية أثناء التمديد ، فسيتم طرح استثناء OutofMemoryError.
مكدس الطريقة المحلية <br /> مكدس الطريقة المحلية يشبه الجهاز الظاهري. . تجمع بعض الأجهزة الافتراضية مباشرة بين مكدس الطريقة المحلية ومكدس الجهاز الظاهري في واحدة.
سوف يرمي stackoverflowerror و outofmemoryerror تشوهات.
كومة جافا
كومة Java هي منطقة ذاكرة مشتركة من قبل جميع المواضيع.
كومة جافا هي المنطقة الرئيسية لإدارة جامع القمامة. نظرًا لأن المجمع يستخدم بشكل أساسي لتقسيم خوارزميات إعادة التدوير ، يمكن أيضًا تقسيم كومة Java على النحو التالي: الجيل الجديد والشيخوخة. من منظور توزيع الذاكرة ، قد يقسم كومة Java المتأخرة مؤشرات ترابط متعددة موزعة خاصة (TLAB).
يمكن أن تكون كومة Java في مساحة ذاكرة متقطعة مادية ، طالما أنها مستمرة منطقيا. من حيث التنفيذ ، لا يمكن فقط تحقيق حجم أو امتداد ثابت.
إذا لم يكن هناك تخصيص مثيل لإكمال الذاكرة في الكومة ، ولا يمكن إكمال الوبر ، فسيتم طرح OutofMemoryError.
منطقة الطريقة
منطقة الطريقة هي منطقة ذاكرة مشتركة بواسطة مؤشرات ترابط مختلفة.
نسبيًا ، نادراً ما ظهرت سلوكيات جمع القمامة في هذا المجال ، لكنها ليست موجودة بشكل دائم في مجال طريقة دخول البيانات.
عندما لا تستطيع منطقة الطريقة تلبية احتياجات توزيع الذاكرة ، سيتم طرح OutofMemoryerror.
تشغيل حمام السباحة الثابت:
إنه جزء من منطقة الطريقة ، والتي يتم استخدامها لتخزين أنواع مختلفة ومراجع الرموز الناتجة عن فترة التجميع.
الذاكرة المباشرة
الذاكرة المباشرة ليست جزءًا من منطقة البيانات عند تشغيلها في فئة NIO.
لن يقتصر تخصيص الذاكرة المباشرة على حجم كومة Java ، ولكنه سيكون محدودًا بحجم الذاكرة ، وقد يلقي الجميع أيضًا استثناء OutofMemoryRerror.
ثالثًا ، عملية إنشاء الكائنات والتخطيط والوصول إليها
خلق الكائن
يتطلب إنشاء كائن عادةً الكلمة الرئيسية الجديدة. إذا تم تنفيذ عملية تحميل الفئة المقابلة.
بعد تحميل الفصل ، سيقوم الجهاز الظاهري بتخصيص الذاكرة للطلاب الجدد. تعادل مهمة تخصيص مساحة للكائن تقسيم قطعة من الذاكرة التي تحددها الحجم من كومة Java. هناك طريقتان لتخصيصهما: يُطلق على تصادم مؤشر. اسم آخر هو قائمة فارغة: إذا كانت الذاكرة في كومة Java غير منتظمة ، فإن الجهاز الظاهري يحتاج إلى الحفاظ على قائمة واحدة ، والتي تتوفر كتلة الذاكرة. مثيل الكائن. يتم تحديد طريقة التوزيع التي يتم تحديدها ما إذا كان كومة Java يتم تنظيمها ، وما إذا كان يتم تحديد كومة Java من خلال ما إذا كان جامع القمامة يستخدم مع الانضغاط والوظيفة التنظيمية. مشكلة أخرى يجب مراعاتها هي مشكلة أمان الخيط عندما ينشئ الكائن. من الذاكرة (TLAB) في كومة Java.
بعد اكتمال توزيع الذاكرة ، يحتاج الجهاز الظاهري إلى تهيئة مساحة الذاكرة الموزعة إلى قيمة صفر. تضمن هذه الخطوة استخدام حقل المثيل للكائن مباشرة في رمز Java بدون القيمة الأولية.
بعد ذلك ، يحتاج الجهاز الظاهري إلى تعيين الإعدادات اللازمة ، مثل فئة هذا الكائن هي مثيل الفئة ، وكيفية العثور على معلومات البيانات الوصفية للفئة ، وما إلى ذلك. يتم تخزين هذه المعلومات في رأس كائن الكائن.
بعد الانتهاء من العمل أعلاه ، تم إنشاء كائن جديد من منظور الجهاز الظاهري. ومع ذلك ، من وجهة نظر برنامج Java ، فإن طريقة init مطلوبة أيضًا لتهيئة الكائن وفقًا لرغبات المبرمج.
تخطيط الذاكرة للكائن
في الجهاز الظاهري للنقطة الساخنة ، يمكن تقسيم تخطيط الكائنات في الذاكرة إلى ثلاثة أجزاء: رأس الكائن ، وبيانات المثيل ، وملء المحاذاة.
يتضمن رأس الكائن جزأين: يتم استخدام الجزء الأول لتخزين بيانات الكائن نفسه ، مثل رمز التجزئة ، وعمر شيخوخة GC ، والأقفال التي تحتفظ بها مؤشرات الترابط. المسؤول يسمى "مارك كلمة". الجزء الثاني هو مؤشر النوع ، أي مؤشر الكائن إلى بيانات الفئة الميتاد ، ويحدد الجهاز الظاهري فئة هذا الكائن بواسطة هذا المؤشر.
بيانات المثيل هي معلومات فعالة مخزنة في الكائن ، وهي أيضًا مجموعة متنوعة من محتوى الحقل المحدد في رمز البرنامج.
ملء المحاذاة لا يوجد بالضرورة ، فقط يلعب دور شخصية الاحتلال. ، يتطلب Hotpot VM أن يكون عنوان بدء الكائن عبارة عن مضاعفات عدد صحيح من 8 بايت. تنسيق.
تحديد موقع الوصول إلى الكائن
يقوم برنامج Java بتشغيل الكائن المحدد على المكدس من خلال البيانات المرجعية على المكدس. طرق الوصول الرئيسية هما نوعان: المقبض والمؤشر المباشر:
الموظفون: سوف ترسم أكوام Java جزءًا من تجمع المقبض. كما هو مبين في الشكل:
المؤشر المباشر: يجب أن ينظر تخطيط كائن Java Pile في كيفية وضع المعلومات ذات الصلة من نوع بيانات نوع الوصول ، ويتم تخزين عنوان الكائن في المرجع. كما هو مبين في الشكل:
تتمتع الطريقتين بمزاياها الخاصة الإنفاق الزمني لموضع المؤشر.
ما سبق هو كل محتويات هذه المقالة.