تفاصيل Java JVM:
المعرفة ذات الصلة حول JVM
1. كومة ومكدس الذاكرة
1. ذاكرة المكدس في JVM تخزن بشكل أساسي الإشارات إلى الأنواع الأساسية من المتغيرات والكائنات.
2. يتم تخزين ذاكرة الكومة في JVM بشكل رئيسي الكائنات والصفائف التي تم إنشاؤها مع سلاسل جديدة ومتغيرة الطول (StringBuilder و StringBuffered) في ذاكرة الكومة.
تتمثل ميزة استخدام الكومة في أنه يتم تخصيص مساحة تخزين مخصصة ديناميكيًا ، وهو أكثر مرونة ، ولكن العيب هو أنه من أبطأ تخصيص الذاكرة ديناميكيًا ؛ على الرغم من أن استخدام المكدس أسرع ، ويمكن تحقيق مشاركة البيانات ، ولكن العيب هو أن حجم البيانات وعمرها في المكدس يجب تحديدها وتفتقر إلى المرونة
3. يتم استخدام تخصيص التخزين الثابت لتخزين المتغيرات الثابتة وكتل الرمز الثابت.
2. فهم JVM
JVM هو جهاز Virtual Java. إنه يحظر المعلومات المتعلقة بمنصة نظام التشغيل المحددة ، بحيث لا يقوم برنامج Java بإنشاء رمز الكائن (رمز البايت) إلا على جهاز Java Virtual ، بحيث يمكن تحقيق عملية منصة منصة ؛
مبدأها هو: يتم تجميع ملف مصدر Java في برامج Bytecode من خلال برنامج التحويل البرمجي Java ، ويتم ترجمة كل تعليمات إلى رمز آلي لمنصات مختلفة من خلال JVM ، وتشغيله عبر منصة معينة ؛
تنقسم منطقة ذاكرة JVM بشكل أساسي إلى: منطقة الطريقة ، مكدس JVM ، كومة ، مكدس الطريقة المحلية ، عداد البرنامج
عداد البرنامج: يستخدم لتسجيل التعليمات التي تم تنفيذها حاليًا ، وهي المنطقة الوحيدة بدون OOM ؛
مكدس JVM: الموضوع خاص. سيقوم كل موضوع بإنشاء مكدس JVM في نفس الوقت. يقوم بتخزين المتغيرات الأساسية المحلية في مؤشر الترابط الحالي ، ونتائج الإرجاع الجزئي ، وإطار المكدس ، وعنوان مرجع الكائن ؛
كومة: مشاركة مؤشرات الترابط ، تستخدم لتخزين بعض الكائنات والصفائف ؛ نظرًا لأنه يتم مشاركته ، فإن الأقفال مطلوبة ، مما يؤدي إلى ارتفاع النفقات العامة ؛
منطقة الطريقة: تتوافق منطقة الطريقة هذه مع جيل مستمر ، والذي يخزن معلومات الفئة (الاسم ، المعدل ، إلخ) ، المتغيرات الثابتة في الفصل ، الثوابت المحددة في الفصل مع النهائي ، إلخ.
مكدس الطريقة المحلية: تستخدم لدعم تنفيذ الأساليب الأصلية وتخزين حالة الاتصال لكل طريقة أصلية ؛
تركز مجموعة Java Garbage بشكل أساسي على مناطق الكومة والأسلوب: يتم تقسيم الكومة إلى الجيل الجديد والجيل القديم ، وعموماً سيتم وضع الأشياء الجديدة في الجيل الجديد ؛ ويقسم الجيل الجديد إلى منطقة عدن ومناطق ناجين ؛
آلية جمع القمامة هي: أولاً تحديد الكائنات التي هي القمامة ، أي أنها لم تعد تستخدم ، ثم تستخدم الخوارزميات المقابلة (خوارزمية إزالة العلامات ، خوارزمية نسخ ، خوارزمية تجميع العلامات ، خوارزمية مجموعة الأجيال) ؛
1. خوارزمية ماركات:
وهي مقسمة إلى مرحلتين ، مرحلة العلامات ومرحلة المقاصة. أولاً ، حدد الكائن الذي يحتاج إلى إعادة تدويره ، ثم إعادة تدوير المساحة التي يشغلها كائن العلامات ؛
تنفيذها بسيط نسبيًا ، ولكن عيوبه هو أنه من السهل إنشاء شظايا ذاكرة ، مما يؤدي إلى عدم القدرة على إيجاد ذاكرة كافية عند تخصيص مساحة للكائنات الكبيرة في المستقبل ، وتشغيل إجراء جديد لجمع القمامة مقدمًا ؛
2. نسخ خوارزمية:
من أجل حل أوجه القصور في خوارزمية تنظيف العلامات ، تقسم خوارزمية النسخ الذاكرة إلى مجالين متساويين في الحجم وفقًا للسعة ، ويتم استخدام واحد منها فقط في وقت واحد. بعد استخدام قطعة واحدة ، يتم نسخ الكائن الذي لا يزال محقًا إلى منطقة أخرى ، ثم يتم تنظيف المنطقة المستخدمة ، بحيث لا يسهل حدوث تجزئة ؛
يتم حل مشكلة تجزئة الذاكرة ، ولكن العيب هو أن الذاكرة المستخدمة يتم تقليلها إلى نصف الأصل ، وترتبط كفاءة النسخ بعدد الكائنات الباقية. عندما يكون العدد كبيرًا ، يتم تقليل الكفاءة بشكل كبير ؛
3. خوارزمية تنظيم العلامات
من أجل حل عيوب خوارزمية النسخ ، ولدت خوارزمية Mark Tidy ، وكانت مرحلة العلامات مثل خوارزمية تنظيف العلامات. أولاً ، يتم تمييز الكائنات التي تحتاج إلى إعادة تدويرها ، لكنها لا تعيد تدويرها مباشرة ، ولكنها تنقل جميع الأشياء الباقية على الجانب الآخر ، ثم ينظف الذاكرة خارج الحدود ؛
4. خوارزمية جمع الأجيال
هذه هي الخوارزمية الأكثر استخدامًا في الوقت الحاضر. فكرتها الأساسية هي تقسيم الذاكرة إلى عدة مناطق مختلفة وفقًا لدورة البقاء على قيد الحياة للكائن. بشكل عام ، تنقسم منطقة الكومة إلى الجيل الجديد والجيل القديم. تتمثل سمة الجيل القديم في وجود عدد أقل من الأشياء التي تحتاج إلى إعادة تدويرها في كل مرة يتم فيها جمع القمامة ، بينما يوجد المزيد من الجيل الجديد ، يتم اعتماد خوارزميات مختلفة ؛
في الوقت الحالي ، يستخدم معظم الجيل الجديد خوارزميات نسخ ، ولكن في الواقع ، لا ينقسم الجيل الجديد إلى نسبة 1: 1. بشكل عام ، ينقسم الجيل الجديد إلى مساحة أكبر عدن ومساحة أصغر من الناجين. في كل مرة يتم فيها استخدام مساحة عدن وأحد مساحات الناجين ، عند إعادة تدويرها ، يتم تنظيف الكائنات التي لا تزال محققة في عدن والناجين إلى مساحة أخرى من الناجين ، ثم يتم تنظيف عدن والمساحات الناجية التي تم استخدامها للتو.
نظرًا لأن الشيخوخة هي أنه يتم إعادة تدوير عدد صغير فقط من الكائنات في كل مرة ، يتم استخدام خوارزمية Mark-Compact بشكل عام.
لاحظ أن هناك جيلًا آخر خارج منطقة الكومة ، وهو توليد دائم ، والذي يتم استخدامه لتخزين فصول الدرجة ، والثوابت ، وأوصاف الطريقة ، وما إلى ذلك. إعادة تدوير الجيل الدائم بشكل أساسي يعيد تدوير جزأين: الثوابت المهملة والفصول الدراسية غير المجدية.
فكيف نحدد أي كائن "القمامة"؟
الطريقة 1. طريقة العد المرجعية:
في Java ، يرتبط بالكائنات من خلال المراجع ، أي إذا كنت ترغب في تشغيل الكائنات ، فيجب أن يتم ذلك من خلال المراجع. ثم من الواضح أن طريقة سهلة هي الحكم على ما إذا كان يمكن إعادة تدوير كائن عن طريق العد المرجعي. دون فقدان عمومية ، إذا لم يكن للكائن أي مراجع مرتبطة به ، فهذا يعني أنه من غير المحتمل أن يتم استخدام الكائن في مكان آخر ، ثم يصبح الكائن كائنًا قابل لإعادة التدوير. تصبح هذه الطريقة طريقة العد المرجعية.
المزايا: التنفيذ البسيط والكفاءة العالية
العيوب: غير قادر على حل مشكلة المراجع الدائرية
الطريقة 2. طريقة تحليل إمكانية الوصول:
الفكرة الأساسية لهذه الطريقة هي البحث من خلال سلسلة من كائنات "GC Roots" كنقطة انطلاق. إذا لم يكن هناك مسار يمكن الوصول إليه بين "جذور GC" وكائن ، يقال إن الكائن غير قابل للوصول. ومع ذلك ، تجدر الإشارة إلى أن الكائن الذي يُحكم عليه أنه لا يمكن الوصول إليه قد لا يصبح بالضرورة كائنًا قابل لإعادة التدوير. يجب أن يمر الكائن الذي يتم الحكم عليه على أنه لا يمكن الوصول إليه من خلال عمليتين على الأقل لتصبح كائنًا قابل لإعادة التدوير. إذا لم يكن هناك أي إمكانية لتصبح كائنًا قابل لإعادة التدوير خلال هاتين العمليتين للعلامة ، فسيصبح بشكل أساسي كائنًا قابل لإعادة التدوير.
ما هي الأشياء التي يمكن أن تكون جذور GC؟
1. الكائن المشار إليه في مكدس JVM (جدول المتغير المحلي في إطار المكدس).
2. الكائن المشار إليه بواسطة سمات فئة ثابتة في منطقة الطريقة.
3. الكائنات المشار إليها من قبل الثوابت في منطقة الطريقة
4. الكائن المشار إليه من قبل JNI (أي الطريقة الأصلية العامة) في مكدس الطريقة المحلية.
بالنسبة للمبرمجين ، يمكننا أيضًا تقليل النفقات العامة GC من خلال بعض الطرق:
1. لا تعرض طريقة system.gc ()
2. قلل من استخدام الأشياء المؤقتة
3. عندما لا يكون الكائن قيد الاستخدام ، يتم تعيين إعداد العرض على NULL
4. حاول استخدام StringBuilder بدلاً من السلاسل المتراكمة السلسلة
5. إذا كنت تستطيع استخدام الأنواع الأساسية من المتغيرات (int طويلة) ، فلا تستخدم الكائنات (عدد صحيح ، طويل)
6. استخدم متغيرات الكائنات الثابتة بأقل قدر ممكن
شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!