مقدمة
تتكون منطقة ذاكرة Java بشكل أساسي من عدادات البرامج ، ومكدس الجهاز الظاهري Java ، ومكدس الطريقة المحلية ، وأكوام Java ، ومناطق الأسلوب ، ومسابح ثابتة وقت التشغيل. ستقدمك هذه المقالة بالتفصيل حول تقسيم واستثناءات مناطق ذاكرة Java. لن أقول الكثير أدناه ، دعنا نلقي نظرة على المقدمة التفصيلية معًا.
منطقة بيانات وقت التشغيل
عندما تقوم JVM بتشغيل برامج Java ، فإنها تقسم الذاكرة إلى عدة مناطق بيانات مختلفة.
عداد البرنامج
الموضوع الخاص. يمكن اعتباره مؤشرا لأرقام سطر من رمز bytecode الذي تم تنفيذه بواسطة مؤشر الترابط الحالي. يتمثل عمل مترجم Bytecode في قراءة تعليمات Bytecode التالية التي سيتم تنفيذها عن طريق تغيير قيمة العدد هذه.
يتم تحقيق القراءة المتعددة عن طريق تبديل مؤشرات الترابط بدورها وتخصيص وقت تنفيذ المعالج. في أي لحظة ، لا يمكن للنواة تنفيذ التعليمات إلا في مؤشر ترابط واحد. من أجل الاستعادة إلى موضع التنفيذ الصحيح بعد تبديل مؤشرات الترابط ، يحتاج كل مؤشر ترابط إلى عداد برنامج مستقل. هذا ما ذكرته في بداية "Thread Private". إذا كانت الطريقة التي يتم تنفيذ مؤشر الترابط هي طريقة Java ، فإن العداد يسجل عنوان تعليمات الجهاز الظاهري Bytecode ؛ إذا كانت طريقة أصلية ، فإن قيمة العداد فارغة. عداد البرنامج هو المجال الوحيد الذي لا يتم فيه تحديد موقف OOM (OutOfMemoryError) في مواصفات الجهاز الظاهري Java.
مكدس الجهاز الافتراضي Java
المواضيع خاصة ، مع نفس دورة الحياة مثل المواضيع. يصف مكدس الجهاز الظاهري Java نموذج الذاكرة لطرق Java: ستقوم كل طريقة بإنشاء إطار مكدس عند تنفيذه ، وتخزين الجداول المتغيرة المحلية ، ومكدس المعامل ، والروابط الديناميكية ، ومعلومات خروج الطريقة. من المكالمة إلى النهاية ، تتوافق كل طريقة مع إدخال المكدس وعملية الخروج من إطار المكدس هذا في مكدس الجهاز الظاهري. يحفظ جدول المتغير المحلي أنواع البيانات الأساسية المختلفة (int ، double ، char ، byte ، إلخ) ، مرجع الكائن (وليس الكائن نفسه) ، ونوع الإرجاع (يشير إلى عنوان bytecode).
استثناءان محتملان في هذا المجال:
كومة الطريقة المحلية
يقوم مكدس الجهاز الظاهري أعلاه بتنفيذ خدمات طريقة Java لـ JVM ، وتنفيذ الطريقة المحلية الخدمة الأصلية. يشبه البعض الآخر مكدس الجهاز الظاهري ، وسيتم أيضًا إلقاء Stackoverflowerror و OutofMemoryError.
كومة جافا
يشير السابق إلى "ذاكرة المكدس" و "ذاكرة الكومة" ، ويشير إلى مكدس الجهاز الظاهري ، ويشير الأخير إلى كومة Java. تتم مشاركة كومة Java بواسطة المواضيع. تم إنشاؤها عندما يبدأ الجهاز الظاهري.
دور كومة Java هو تخزين مثيلات الكائنات. يمكن أن يكون كومة Java في مساحة ذاكرة متقطعة جسديًا ، ويتطلب فقط مستمرًا منطقيًا.
منطقة الطريقة
المنطقة المشتركة بواسطة المواضيع. تخزن البيانات مثل معلومات الفئة ، والثوابت ، والمتغيرات الثابتة ، والرمز الذي تم تجميعه بواسطة المترجم ، وما إلى ذلك التي تم تحميلها بواسطة الجهاز الظاهري. عندما لا تستطيع منطقة الطريقة تلبية متطلبات تخصيص الذاكرة ، يتم إلقاء OutofMemoryError.
حمام سباحة ثابت وقت التشغيل
تجمع وقت التشغيل الثابت هو جزء من منطقة الطريقة. يتم استخدام C لتخزين العديد من الثوابت الحرفية والمراجع الرمزية التي تم إنشاؤها خلال فترة التجميع ، وسيتم تخزينها في تجمع وقت التشغيل الثابت الذي يدخل منطقة الطريقة بعد تحميل الفصل. لا تتطلب لغة Java توليد الثوابت فقط خلال فترة الترجمة. بمعنى آخر ، يمكن وضع ثوابت جديدة خلال فترة التشغيل.
الذاكرة المباشرة
الذاكرة المباشرة ليست جزءًا من منطقة بيانات وقت تشغيل الجهاز الظاهري ، كما أنها ليست منطقة ذاكرة. لن يقتصر تخصيص الذاكرة المباشرة للجهاز الأصلي بحجم كومة Java ، ولكنها ذاكرة بعد كل شيء. إذا كان مجموع كل منطقة ذاكرة أكبر من الحد الأقصى للذاكرة الفعلية ، فسيظل يظهر OutofMemoryError.
عملية إنشاء الكائن
يواجه الجهاز الظاهري تعليمات "جديدة":
تخطيط الذاكرة للكائنات
يمكن تقسيم تخطيط الكائنات المخزنة في الذاكرة إلى 3 مناطق:
رأس الكائن: يخزن بيانات وقت التشغيل الخاصة بالكائن ، مثل رمز التجزئة ، عصر توليد GC ، علامة حالة القفل ، القفل الذي يحتفظ به مؤشرات الترابط ، معرف مؤشر الترابط المتحيز ، إلخ يستخدم الجهاز الظاهري هذا المؤشر لتحديد مثيل الفئة الذي ينتمي إليه الكائن.
بيانات المثيل: المعلومات الصحيحة حقًا للكائن ، ومحتوى أنواع مختلفة من الحقل المحددة في البرنامج ؛
ملحق المحاذاة: غير ضروري ، دور الركاب.
تحديد موقع الوصول إلى الكائن
تقوم برامج Java بتشغيل كائنات مثيل على الكومة من خلال المراجع على المكدس. على سبيل المثال
الشخص p = شخص جديد () ؛
هنا P هو مرجع ، والكائن الشخص الذي تنتجه الجديد هو مثيل.
لا يحدد هذا المرجع كيفية تحديد موقع الكائنات المحددة والوصول إليها في الكومة. هناك طريقتان للوصول السائد:
مقبض. سيتم تقسيم جزء من الذاكرة إلى كومة Java كتجمع مقبض ، والذي يشير إلى عنوان معطف الكائن ، ويحتوي المقبض على بيانات مثيل الكائن وبيانات الكتابة. الميزة هي أنه عند نقل الكائن ، تحتاج فقط إلى تغيير العنوان في المقبض ، ولا يلزم تعديل المرجع نفسه.
مؤشر مباشر. يتم تخزين عنوان الكائن مباشرة في المرجع. الميزة هي أن السرعة أسرع ، ولأن المرجع يمثل مباشرة عنوان كائن المثيل ، يتم حفظ عملية تحديد موقع المؤشر. هذا هو بالضبط الطريقة التي تستخدم بها نقطة الساخنة.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.