سؤال

لقد قرأت مؤخرًا الكثير عن مخططات تخصيص الذاكرة في جافا ، وكان هناك العديد من الشكوك كما كنت أقرأ من مصادر مختلفة. لقد جمعت مفاهيمي ، وسأطلب من جميع النقاط والتعليق عليها. تعرفت على أن تخصيص الذاكرة محدد JVM ، لذلك يجب أن أقول مسبقًا ، أن سؤالي محدد.

  1. الفصول (التي يتم تحميلها من قِبل قائدي Classload) تذهب في منطقة خاصة على الكومة: جيل دائم
  2. جميع المعلومات المتعلقة بصف مثل اسم الفصل ، ومصفوفات الكائنات المرتبطة بالفئة ، والأشياء الداخلية المستخدمة من قبل JVM (مثل Java/Lang/Object) ومعلومات التحسين تنتقل إلى منطقة الجيل الدائم.
  3. يتم الاحتفاظ بجميع متغيرات الأعضاء الثابتة في منطقة الجيل الدائم مرة أخرى.
  4. الكائنات تذهب في كومة مختلفة: جيل شاب
  5. لا يوجد سوى نسخة واحدة من كل طريقة لكل فئة ، تكون الطريقة ثابتة أو غير منتظمة. يتم وضع هذه النسخة في منطقة الجيل الدائم. بالنسبة للطرق غير الستاطية ، تذهب جميع المعلمات والمتغيرات المحلية إلى المكدس-وكلما كان هناك احتجاج ملموس لهذه الطريقة ، نحصل على إطار مكدس جديد مرتبط به. لست متأكدًا من أين يتم تخزين المتغيرات المحلية للطريقة الثابتة. هل هم على كومة الجيل الدائم؟ أو يتم تخزين مرجعها فقط في منطقة الجيل الدائم ، والنسخة الفعلية في مكان آخر (أين؟)
  6. أنا أيضًا غير متأكد من أين يتم تخزين نوع الإرجاع للطريقة.
  7. إذا احتاجت الكائنات (في الجيل الشاب) إلى استخدام عضو ثابت (في الجيل الدائم) ، يتم إعطاؤها إشارة إلى العضو الثابت && يتم إعطاؤهم مساحة كافية لتخزين نوع الإرجاع للطريقة ، إلخ.

شكرا لك على ذلك من خلال هذا!

هل كانت مفيدة؟

المحلول

أولاً ، كما يجب أن يكون واضحًا لك الآن بعد أن يوجد عدد قليل جدًا من الأشخاص الذين يمكنهم تأكيد هذه الإجابات من المعرفة المباشرة. قلة قليلة من الناس عملوا على نقاط الساخنة الأخيرة JVMs أو درسهم على العمق اللازم لمعرفة حقًا. يستجيب معظم الناس هنا (من بينهم أنا) استنادًا إلى الأشياء التي شاهدوها مكتوبة في مكان آخر ، أو ما استنتجوه. عادة ما يتم كتابة ما هو مكتوب هنا ، أو في مقالات مختلفة وصفحات الويب ، على مصادر أخرى قد تكون أو لا تكون نهائية. غالبًا ما يتم تبسيطها أو غير دقيقة أو خاطئة.

إذا كنت تريد تأكيدًا نهائيًا لإجاباتك ، فأنت بحاجة حقًا إلى تنزيل OpenJDK Sourcecode ... و قم ببحثك الخاص من خلال قراءة وفهم رمز المصدر. إن طرح الأسئلة حول ذلك ، أو الصيد عبر مقالات الويب العشوائية ليس تقنية بحث أكاديمية سليمة.

وقد قلت ذلك ...

1) الفصول (التي يتم تحميلها من قِبل قائدي Classload) تذهب في منطقة خاصة على الكومة: جيل دائم.

afaik ، نعم. ((تحديث: انظر أدناه.)

2) جميع المعلومات المتعلقة بفئة مثل اسم الفصل ، ومصفوفات الكائنات المرتبطة بالفئة ، والكائنات الداخلية المستخدمة من قبل JVM (مثل Java/Lang/Object) وتدخل معلومات التحسين إلى منطقة الجيل الدائم.

أكثر أو أقل ، نعم. لست متأكدًا مما تقصده ببعض هذه الأشياء. أظن أن "الكائنات الداخلية المستخدمة من قبل JVM (مثل Java/Lang/Object)" تعني واصفات فئة JVM الداخلية.

3) يتم الاحتفاظ بجميع متغيرات الأعضاء الثابتة في منطقة الجيل الدائم مرة أخرى.

المتغيرات نفسها نعم. هذه المتغيرات (مثل جميع متغيرات Java) ستحتفظ إما بالقيم البدائية أو مراجع الكائنات. ومع ذلك ، في حين أن متغيرات الأعضاء الثابتة موجودة في إطار تم تخصيصه في كومة بيرجين أي كومة.

4) الأشياء تذهب في كومة مختلفة: جيل شاب

ليس بالضرورة. كائنات كبيرة مايو يتم تخصيصها مباشرة في الجيل المرفق.

5) لا يوجد سوى نسخة واحدة من كل طريقة لكل فئة ، تكون الطريقة ثابتة أو غير منتظمة. يتم وضع هذه النسخة في منطقة الجيل الدائم.

على افتراض أنك تشير إلى رمز الطريقة ، ثم AFAIK نعم. قد يكون أكثر تعقيدًا بقليل. على سبيل المثال ، قد يوجد هذا الرمز في نماذج الكود Bytecode و/أو الأصلي في أوقات مختلفة خلال حياة JVM.

... بالنسبة للطرق غير المنتظمة ، تذهب جميع المعلمات والمتغيرات المحلية إلى المكدس-وكلما كان هناك احتجاج ملموس لهذه الطريقة ، نحصل على إطار مكدس جديد مرتبط به.

نعم.

... لست متأكدًا من أين يتم تخزين المتغيرات المحلية للطريقة الثابتة. هل هم على كومة الجيل الدائم؟ أو يتم تخزين مرجعها فقط في منطقة الجيل الدائم ، والنسخة الفعلية في مكان آخر (أين؟)

لا. يتم تخزينها على المكدس ، تمامًا مثل المتغيرات المحلية في الأساليب غير المنتظمة.

6) أنا أيضًا غير متأكد من أين يتم تخزين نوع العودة للطريقة.

إذا كنت تقصد القيمة تم إرجاعها بواسطة استدعاء طريقة (غير ضعي) ، ثم يتم إرجاعها على المكدس أو في سجل الجهاز. إذا تم إرجاعه على المكدس ، فهذا يستغرق واحدة أو كلمتين ، اعتمادًا على نوع الإرجاع.

7) إذا كانت الكائنات (في الجيل الشاب) لاستخدام عضو ثابت (في الجيل الدائم) ، يتم إعطاؤهم إشارة إلى العضو الثابت &&هم يتم إعطاؤهم مساحة كافية لتخزين نوع الإرجاع للطريقة ، إلخ .

هذا غير دقيق (أو على الأقل ، أنت لا تعبر عن نفسك بوضوح).

إذا تصل بعض الطرق إلى متغير عضو ثابت ، فإن ما يحصل عليه هو إما قيمة بدائية أو كائن المرجعي. قد يتم تعيين هذا إلى متغير أو معلمة محلية (موجودة) ، مُعينت على عضو ثابت أو غير منتظم (موجود) ، مخصص لعنصر (موجود) من صفيف مخصص مسبقًا ، أو ببساطة يستخدم وتجاهل.

  • في أي حال من الأحوال لا الجديد يجب تخصيص التخزين للاحتفاظ إما مرجعًا أو قيمة بدائية.

  • عادةً ما تكون كلمة واحدة من الذاكرة هي كل ما هو مطلوب لتخزين كائن أو مرجع صفيف ، وعادة ما تحتل القيمة البدائية كلمة أو كلمتين ، اعتمادًا على بنية الأجهزة.

  • في أي حال ، يجب تخصيص المساحة من قبل المتصل لعقد بعض الكائنات / الصفيف الذي تم إرجاعه بواسطة طريقة ما. في Java ، يتم دائمًا إرجاع الكائنات والمصفوفات باستخدام دلالات المرور بالمرور ... ولكن هذه القيمة التي يتم إرجاعها هي كائن أو مرجع صفيف.

تحديث

اعتبارًا من Java 8 ، تم استبدال مساحة Permgen بـ Metaspace. لمزيد من المعلومات ، يرجى الرجوع إلى هذه الموارد:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top