جافا GC شهدت العديد من المقالات، وهذا خمسة أسئلة قد لا يعرف

الكاتب | النجم Regulus الرياح

ذبيان | تو مين

المصدر | الكون البرمجة

لن تتكرر هذه المقالة خوارزمية الحديث GC وجمع القمامة، ولكن إلى نقاش حول متى يحدث GC، هناك العديد من القضايا التي يمكن التغاضي عنها. تعرف على هذه القضايا، ونحن نعتقد أن GC إلى تعميق فهم لفترة أطول قليلا.

المحتويات الرئيسية:

  • Q1: GC كيف يبدأ العمل؟

  • Q2: أوقفوا العالم في النهاية كيفية جعل توقفت عن المواضيع جافا؟

  • Q3: كيف يمكنني العثور على جذور GC؟

  • Q4: كيفية التعامل مع أربعة إشارة خاصة إلى GC؟

  • Q5: بعد نقل الكائن، ما يشير إلى كيفية إصلاح؟

Q1: GC كيف يبدأ العمل؟

ينقسم جمع القمامة إلى أقسام مختلفة MinorGC وFullGC، مما اثار أقسام مختلفة وظروف مختلفة. تقسيم الزناد العام GC إلى الإيجابية والسلبية فئتين:

  • المفعلة: يعرض تدعو أطلقت System.gc GC (ولا حتى بالضرورة على الفور GC)

  • فشل تخصيص الذاكرة، الحاجة إلى مساحة واضحة: سلبية

إذا كانت الحالات المذكورة أعلاه، التي بدأها GC هي نفس الطريقة:

  • STEP1: موضوع GC يحتاج إلى الشروع في عملية VM_Operation (والذي هو فئة أساسية، مختلفة عملية جمع القمامة التي بدأها فرعية منها، مثل CMS جامع يبدأ VM_GenCollectFullConcurrent)

  • STEP2: العملية نشرها إلى قائمة الانتظار، وموضوع JVM له مقبض مخصص هذه العمليات طلبات VMThread في قائمة الانتظار، ويدعو إلى موضوع VM_Operation تقييم وظيفة محددة للتعامل مع كل عملية.

  • STEP3: VM_Operation تقييم وظيفة وظيفة افتراضية تطلق على نفسها DOIT

  • Step4: كل من جمع القمامة غطاء فرعية مستمدة VM_Operation طريقة DOIT، عملية جمع القمامة لتحقيق عملهم، واستخدام تعدد الأشكال النموذجية C ++.

Q2: أوقفوا العالم في النهاية كيفية جعل توقفت عن المواضيع جافا؟

أعتقد أننا سمعنا STW، في تنفيذ جمع القمامة، كل هذا العمل في المواضيع جافا تحتاج إلى توقف والسبب في ذلك، إلى استعارة كلمة في المقالة أعلاه:

لماذا سيتم تعليق المواضيع عامل الأخرى خلال جمع القمامة؟ تخيل جانبكم في جمع القمامة، في حين أن مجموعة أخرى من الناس اخراج القمامة، وتنظيف القمامة يمكن لك؟

أن هذه المواضيع جافا في النهاية هو كيفية وقفها؟

بالتأكيد ليست أول من قام بإجراء القمامة موضوع جمع تعليق عليها انتظار، والتفكير في ماذا؟

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

توقفت عند الاقتضاء؟ وهكذا يخرج من مفهوم آخر مهم: نقطة آمنة، أدخل على نقطة أمنية للموضوع يعني عدم وجود تغيير في إشارة العلاقة.

يبدأ تزامن أداء من قبل نقطة السلامة وصفها hereinbefore VMThread، تتم مزامنة ذلك قبل دخول الأمن دوت تجهيز VM_Operation، بعد اكتمال هذه العملية، وتزامن سحب نقطة آمنة.

الفراغ VMThread :: حلقة { بينما (صحيح) { ... _cur_vm_operation = _vm_queue- > remove_next. ... // نقطة أمنية بدء التزامن SafepointSynchronize :: تبدأ. // التعامل مع VM_Operation الحالي evaluate_operation (_cur_vm_operation)؛ ... // تزامن أمن نقطة النهاية SafepointSynchronize :: تبدأ. ... } ... }

لاحظ أنه VMThread فوق المواضيع عامل، ستتم معالجة النقاط الأمنية VMOpration سيتم تنفيذها ليس كل من عملية المزامنة وفقا للحالة VMOpration، لمجرد توخيا للوضوح، حذف رمز أعلاه هذه منطقية.

قد يكون موضوع جاوة في حالة مختلفة، بؤرة، اعتمادا على أي موضوع في دولة مختلفة، يسمح لهم بالدخول إلى نقطة أمن الطريقة ليست هي نفسها. هناك بؤرة رمز مصدر في قسم كبير من تعليقاتها لتفسير خاص:

1، فسرت الدولة بايت كود

تنفيذ JVM الجهاز الظاهري بسيط لفهم حالة التبديل كبيرة، ثم الاستمرار في تنفيذ التعليمات البرمجية بايت اتخذت بايت كود الموافق الرمز (هذه ليست سوى نموذج مبسط). يجب أن يكون للJVM على جدول لتسجيل بايت كود وما يقابلها من المعلومات كتلة رمزها، ويسمى الجدول DispatchTable، شوطا طويلا:

في الواقع، هناك نوعان من JVM الداخلية الجدول مثل هذا، في حالة طبيعية، والحاجة إلى إدخال نقطة أمنية.

في رمز إلى مكان آمن، حيث لا يوجد وظيفة لتحل محل إدخال جدول بايت كود ارسال نفاذ أعلاه:

الانتعاش:

بدلا من رمز ارسال الجدول رمز DispatchTable بايت في رمز سيتم إضافة نقطة تفتيش أمنية، لا توجد نشرت لفترة أطول.

2، حالة تنفيذ التعليمات البرمجية الأصلية

للمكالمات JNI موضوع الجارية، والعمليات الخاصة SafepointSynchronize :: تبدأ غير مطلوب. المواضيع جافا تنفذ التعليمات البرمجية الأصلية، من وقت يعود اجهة JNI وأخذ زمام المبادرة للتحقق ما إذا كنت بحاجة إلى شنق نفسه.

3، بعد تنفيذ التعليمات البرمجية المترجمة الدولة

الغالبية العظمى من استخدام JVM الحديثة على حد سواء لحظة التكنولوجيا مترجم JIT، خلال سرعة التنفيذ عادة في أسلوب حجم الجسيمات على رمز تنفيذ وظيفة الساخن في تعليمات الجهاز الأصلي في الفن.

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

في هذه الحالة، ليس من خلال يتم تنفيذ التعليمات البرمجية بايت متوسطة من قبل، وبطبيعة الحال، لن يذهب بايت الجدول رمز الإرسال، وبالتالي فإن الطريقة استبدال جدول بايت كود إيفاد في حالة إجراء مثل هذه الحالة حيث رمز ترابط الأول لا تأثير فوق. كيف نفعل ذلك؟

بؤرة اتخذت بطريقة المعروفة باسم موضوع المقاطعة النشطة للدخول على نقطة أمنية، وتحديدا، هناك صفحة الذاكرة، وإلقاء نظرة على موضوع وعادة ما تعمل من وقت لآخر (قراءة) هذه الصفحة في JVM، وضعها الطبيعي القضية هي كلها طبيعية. وقبل تنفيذ GC، فإن البيت مستكشف VMthread JVM قدما في سمة الوصول إلى الذاكرة هذه الصفحة غير قابل للقراءة، ثم والمواضيع عامل أخرى تذهب قراءة هذه الصفحة، وسوف يؤدي إلى استثناء ذاكرة الوصول، وتركيب JVM في استثناء مسبقا اشتعلت ومن ثم قادرا على السيطرة على تدفق تنفيذ كل موضوع، وبعد القيام ببعض إعداد قبل GC، ثم منع، وتوقف الموضوع.

// لفة فقط عن المواضيع قدما إلى safepoint // وتعليق كل منهم SafepointSynchronize الفراغ :: تبدأ { ... السراج :: make_polling_page_unreadable. ... }

يصبح نظام التشغيل الدعوة :: يجعل make_polling_page_unreadable الصفحة الاقتراع غير قابل للقراءة، ويتم تنفيذ وظيفة مختلفة اعتمادا على منصة نظام التشغيل، مع لينكس المشترك ويندوز هي مثال على ذلك.

لينكس:

السراج باطل :: make_polling_page_unreadable (الفراغ) { إذا (! guard_memory ((تشار *) _ polling_page، لينكس :: PAGE_SIZE)) { قاتلة ( "تعذر تعطيل الصفحة الاقتراع")؛ } } منطقي نظام التشغيل :: guard_memory (تشار * ADDR، حجم size_t) { العودة linux_mprotect (ADDR، حجم، PROT_NONE)؛ } linux_mprotect منطقي ثابت (تشار * ADDR، حجم size_t، الباحث بروت) { شار * أسفل = (تشار *) align_down ((intptr_t) ADDR، نظام التشغيل لينكس :: :: PAGE_SIZE)؛ ASSERT (ADDR == أسفل، "التعقل الاختيار")؛ حجم = align_up (pointer_delta (ADDR، أسفل، 1) + الحجم، نظام التشغيل لينكس :: :: PAGE_SIZE)؛ العودة :: mprotect (أسفل، حجم، بروت) == 0؛ }

النهائي API الدعوة على مستوى النظام: تم تعيين الخاصية mprotect إلى صفحة كاملة من الذاكرة، مألوفة مع لينكس C / C ++ لا ينبغي أن يكون أصدقاء البرمجة غير مألوف.

نوافذ:

السراج باطل :: make_polling_page_unreadable (الفراغ) { DWORD OLD_STATUS. إذا (! VirtualProtect ((تشار *) _ polling_page، السراج :: vm_page_size، PAGE_NOACCESS، وOLD_STATUS)) { قاتلة ( "تعذر تعطيل الصفحة الاقتراع")؛ } }

دعوة النهائية على مستوى النظام API: تم تعيين الخاصية VirtualProtect إلى صفحة كاملة من الذاكرة، يجب على دراية ويندوز C / C ++ برمجة أصدقاء لا يكون غير مألوف.

أين هذه صفحة معينة؟ المتغيرات عضو ثابت تقع وقت الدرجة / OS.

4، وحالة المحظورة

لأن IO، والتزامن القفل وغيرها من الأسباب منعت موضوع ستمنع حتى GC، سوف لا يستيقظون.

5، في ولاية تسليم أو VM

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

Q3: كيف يمكنني العثور على جذور GC؟

من هم جذور GC؟

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

  • VM كومة (المتغيرات المحلية إطار الجدول كومة) الكائنات المشار إليها

  • طريقة جامدة وجوه الطبقة الملكية المشار إليها حسب المنطقة

  • طريقة المنطقة الكائن مرجعية ثابتة

  • أسلوب الأصلي كومة JNI (أي، قال الجنرال، الطريقة الأصلية) الكائنات المشار إليها

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

بما في ذلك الجهاز الظاهري بؤرة جافا، بما في ذلك الحديث اعتمدت استراتيجية استخدام الفضاء للمرة، والفكرة الأساسية هي بسيطة: دفع قياسية جذور معلومات الموقع GC منهم، GC، عندما ما تريد، والعثور عليها بسرعة.

لذا فإن السؤال هو، أين هي هذه المعلومات موقع الوجود؟ وأي نوع من هياكل البيانات؟ يستمر الموضوع إلى تنفيذ، والعلاقات إشارة تتغير باستمرار، كيف يمكن لهذه التحديثات؟

OopMap الرصاص

قبل الإجابة على هذه الأسئلة، دعونا في الوقت الراهن ينسى جذور GC شيء، سؤال آخر للتفكير:

موضوع JVM أثناء فحص أكوام جافا وجدت أرقام 64BIT من 0x0007ff3080345600، كيف تعرف JVM هذا هو أشر إلى كائن عنوان جافا كومة (أي إشارة) أو أن هذا هو مجرد نوع طويل من متغير ذلك؟

وكما نعلم جميعا، جافا اللغة من واحد من أكبر التغييرات في C / C ++ هي للتخلص من مؤشر مزعج، وتحرير المبرمجين لم تعد بحاجة مؤشر لإدارة الذاكرة. في الممارسة العملية، ومع ذلك، للتخلص من مجرد التخلص من السطح، JVM، بعد كل شيء، وكتب في الاشياء C ++، وليس ذلك بكثير جافا ليس مؤشر إلى مرحلة ما نظر، كان جافا في كل مكان المؤشر. ولكن في جاوة، لدينا تغيير في التعبير: المرجعية.

يجب أن يضاف بعد ذلك، في بعض تطبيقات JVM في وقت مبكر، المرجع نفسه هو مجرد قيمة المؤشر هو قيمة المؤشر من الجدول عنوان الكائن. المرجع لم يعد JVM الحديث بهذه الطريقة، ولكن مؤشر الوضع المباشر. بشأن هذه المسألة، في المادة Q6: بعد نقل الكائن، ما يشير إلى كيفية إصلاح؟ وسيتم بمزيد من التفصيل.

نعود إلى السؤال من مجرد لماذا 64BIT JVM يحتاج إلى معرفة البيانات هو إشارة إلى فترة طويلة أو متغير؟ والجواب هو أنه إذا كان لا يعرف، ثم، كيف الذاكرة أذكر ذلك؟

هذا يؤدي إلى مجموعة أخرى من حيث: GC المحافظ وGC صيغة دقيقة.

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

  • بالضبط نوع GC: مقارنة GC المحافظ، وهذا هو الواضح أن 64BIT المعرفة الرقمية هو طويل أو إشارة إلى كائن. JVM التجارية الحديثة تستخدم هذه الطريقة أكثر تقدما، وهذا يمكن JVM نعرف بوضوح شغل في هيكل المكدس والكائنات في كل وحدة عنوان بشيء، فإنه من الخطأ أن يقتل، وليس لقتل تسرب.

لذا، كيف يمكنك أن تعرف بالضبط نوع من GC هو واضح جدا؟ والجواب هو أن المعلومات والبيانات الذاكرة JVM في هذه السجلات لا، في بؤرة، ودعا هذه البيانات OopMap.

وأخيرا، للإجابة على هذا السؤال في القسم السابق، جذور GC المعلومات الموقع الذي هو OopMap في.

OopMap اعادوا طويلة؟

كيف توليد البيانات OopMap؟

يتم إنشاء بؤرة شفرة المصدر على البيانات OopMap ذات الصلة المنتشرة في أماكن مختلفة، يمكنك العثور عليها من خلال البحث عن الكلمات الرئيسية OopMap جديدة في الدليل المصدر، من خلال قراءة أولية، يمكن أن ينظر إليه في عودة وظيفة، والقفز غير طبيعي، ودورة القفز نقل وغيرها من الأماكن وجودهم، في هذه الأوقات، سيتم استخدام JVM للتسجيل لاحق المعلومات GC OopMap.

Q4: كيفية التعامل مع أربعة إشارة خاصة إلى GC؟

أي المادة إلى المادة GC سيقول لنا: بدأت تجد أي إشارة إلى كائن من الجذور GC بواسطة خوارزمية وسائل الأتصال. ولكن الإشارة هنا ليست بهذه البساطة.

عادة نحن نتحدث عن وسائل جافا أن إشارة قوية، وهناك بعض المراجع بالإضافة إلى ذلك:

  • إشارة قوية: الافتراضي مباشرة إلى كائنات جديدة للخروج

  • المرجع لينة: SoftReference

  • المراجع ضعيفة: WeakReference

  • اقتبس كاذبة: PhantomReference، المعروف أيضا باسم شبح المرجعية

وفيما يلي أول من جعل مقدمة بسيطة إلى المراجع القليلة المذكورة أعلاه، فإن الإشارة قوية الافتراضية كي لا نقول:

المراجع المرنة

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

انها تتلخص في التالي: إذا كائن A الآن سوى SoftReference كائنات لا تزال تشير إلى أنه في ظل الظروف العادية، عندما تكون الذاكرة ليست كافية لتنظيف وA. ولكن إذا كانت ذاكرة ضيقة، آسف، سوف تحصل على قطع، وتنظيف A. وهذا هو أيضا السبب تعكس المراجع الناعمة "لينة".

إشارات ضعيفة

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

ضعف القدرة المراجع الأضعف، ضعيف إلى حتى في حالة ذاكرة كافية، إذا الكائن وما هو إلا إشارة إلى كائن من المراجع WeakReference لينة، ثم أنا آسف، يمكنك أيضا جعل عملية جراحية. وهذا هو أيضا السبب في أن إشارات ضعيفة "ضعيفة" يعكس.

اقتبس كاذبة

إذا كان هناك كائن إشارة الوهمية تمت تماما لن يؤثر على زمن بقائهم على قيد الحياة، لا يمكن الحصول على نسخة افتراضية من كائن حسب المرجع. والغرض الوحيد من تعيين مرجع الافتراضية المرتبطة كائن قادر على تلقي إعلام عندما يتم استرداد النظام الكائن جامع. ---- مقتطفات من "فهم متعمق للآلة جافا الافتراضية"

المراجع ضعيفة أضعف من أعلاه، وحتى إلى حد ما لا اقتبس حقا، لأنه، على عكس ما سبق طريقتين يمكن الحصول عليها عن طريق الحصول على مرجع إلى الأصل، وذلك بعد تغطية إرجاع الأسلوب على:

الطبقة العامة PhantomReference < تي >  يمتد المرجعي < تي >  { الجمهور T حصول { العودة؛ } }

اقتبس النهائي

بالإضافة إلى أربعة أنواع، هناك إشارة خاصة تسمى FinalReference، يتم استخدام إشارة التنفيذ من طريقة finalizer لدعم الجبهة طريقة تغطية finalizer من كائن الفئة لتنظيفها.

عدة مراجع في مصدر بؤرة على النحو المحدد أعلاه على النحو التالي:

تنظيف

وJVM في تنفيذ GC هو كيفية التمييز بين ما يشير إلى هذه الأنواع الخاصة من ذلك؟

في بؤرة في، لا يهم ما تم اجتاز جامع القمامة، بعد كل من المراجع التي كتبها جذور GC، قبل تنفيذ سيتم استدعاء الكائنات تنظيف ReferenceProcessor :: process_discovered_references العمل للعثور على الحاجة إلى تنظيف المراجع في هذه العملية، التي كتبها هذه الوظيفة اسم يمكن أن يرى ذلك.

ولكن قبل استدعاء هذه الوظيفة، هناك خطوة: نداء ReferenceProcessor :: setup_policy استراتيجية معالجة الإعداد.

منطق وظيفي بسيط جدا لتحديد استخدام _always_clear_soft_ref_policy الحالية أو باستخدام معلمات _default_soft_ref_policy منطقي always_clear.

وكما يتبين من اسم تنظيف دائما ما يشير لينة، والسياسة الافتراضية، نظرة على ما هي هاتين الاستراتيجيتين:

الأول هو دائما استراتيجية تصل النظيفة AlwaysClearPolicy

ثم النهج الافتراضي، إذا كان الملقم حاليا وضع التشغيل، حدد LRUMaxHeapPolicy، وإلا اختيار LRUCurrentHeapPolicy في وضع العميل.

ReferencePolicy هي فئة الظاهري التنظيف should_clear_reference الوظيفة الأساسية قاعدة لتحديد ما إذا كان مرجع خارجي المقابلة. ويوفر استراتيجيات العلاج لمدة أربعة أقسام فرعية المشار إليها في بؤرة:

  • NeverClearPolicy: أبدا تنظيف

  • AlwaysClearPolicy: دائما تنظيف

  • LRUCurrentHeapPolicy: أي لم تستخدم مؤخرا نظيفة (تقييمها مؤخرا الوقت المتبقي من مساحة كومة الحالي)

  • LRUMaxHeapPolicy: أي لم تستخدم مؤخرا نظيفة (تقييمها مؤخرا الوقت المتبقي يمكن استخدامها وفقا لمساحة أقصى كومة)

عند وضع عملية في استراتيجية setup_policy نهاية always_clear أنها صحيحة أو خاطئة؟ لأنه يحدد بشكل مباشر على استراتيجية عملية الاختيار لاحقة لتكون مرجعا لينة غير LRUCurrentHeapPolicy / LRUMaxHeapPolicy أو AlwaysClearPolicy.

وفي هذا الصدد، مصدر بؤرة، تختلف عملية جمع القمامة هي مختلفة قليلا، ولكن المعلمات always_clear وعموما، فإن الغالبية العظمى من المشاهد ليست صحيحة، وفقط عندما عدة محاولات لتخصيص الذاكرة وفشل، ستحاول يتم تعيينها إلى true، تنظيف المراجع ميسرة تصل إلى تحرير المزيد من المساحة.

يرجى تذكر تواجه النهج لينة المذكورة أعلاه واختر هذه الاستراتيجيات، سوف تتأثر السياسات.

الإشارة بوجه خاص إلى تحليل منطق المعالجة

العودة process_discoverd_references وظيفة، نظرة على محتويات هذه الوظيفة:

ليس من الصعب أن نرى من خلال اسم وتعليق المتغيرات داخل الدالة في المكالمات بدوره process_discovered_reflist استكمال تجهيز لينة، وضعف، نهائي، فانتوم أربعة أنواع من المراجع الخاصة.

وأعلنت هذه الوظيفة على النحو التالي:

المعلمة الثانية وسياسة المعلمة clear_referent الثالثة تحت التركيز. إذا نظرنا إلى الوراء فوق المعلمات التي تم تمريرها إلى استدعاء دالة في:

أنواع المراجع policyclear_referentSoftReference غير فارغة trueWeakReferencetrueFinalReferencefalsePhantomReferencetrue

ومعايير مختلفة تحديد مصير أربعة أنواع من المراجع المختلفة.

وبالإضافة إلى نظرة من الداخل process_discovered_reflist في الوظائف الداخلية للتعامل مع المراجع تنقسم إلى ثلاث مراحل، ونحن نرى واحدا تلو الآخر، بدءا من المرحلة الأولى:

المرحلة الأولى: معالجة الإشارات الناعمة

وكما يتبين من التعليقات، المرحلة الأولى للإشارة الناعمة SoftReference فقط، جنبا إلى جنب مع الجدول أعلاه، فقط عند معالجة الإشارات لينة، المعلمة السياسة ليس فارغا.

في عملية تنفيذ وظيفة حقيقية process_phase1، من خلال كافة المراجع الناعمة لكائن لم يعد صالحا لتحديد السياسات المشار إليه بواسطة المذكورة سابقا في وظائف process_discovered_references يتم الاحتفاظ أو إزالتها من الحاجة قائمة لتنظيفها في.

المرحلة الثانية: إزالة الكائنات التي البقاء على قيد الحياة

هذه المرحلة العمل الرئيسي هو للإشارة إلى تلك الكائنات لا يزال على قيد الحياة (هناك إشارات قوية أخرى لأنه في) ما يشير إلى إزالتها من قائمة تنظيف:

المرحلة الثالثة: قطعت النقاط المتبقية من الأشياء المرجعية

من المرحلة الثالثة، وفقا لمعايير الخارجية مرت clear_referent أن تقرر ما إذا كان الاحتفاظ أو إزالة الإشارة من القائمة لتنظيفها.

وإذ يشير إلى الجدول في أعلى مرة أخرى، لضعف، لينة، فانتوم ثلاثة أنواع من المراجع والمعلمات clear_referent غير صحيح، يعني ذلك أن المرحلة النهائية من التحفظ يتم الاحتفاظ، وكلها ليتم القضاء على ما تبقى. حتى في هذه الوظيفة، مجال المرجع المتبقية لهذه المراجع لهذه النقطة، وآخر بقايا هذه الكائنات مع الإشارة بوجه خاص إلى العلاقة بين يمكن قطع، لن يفلتوا في GC لاحق.

وكمرجع نهائي، هذه الحجة غير صحيحة، فإن المرحلة الثالثة لا قطع الكائن. قطع ويتم توقيت الاعدام بعد أسلوب finalizer. لذلك، في الجولة الحالية من GC، يغطي طريقة finalizer كائن فئة سيتم حفظ حياة مؤقتا.

ملخص

انظر هنا، وأنا تقدير فوضوية بعض الشيء، ولكن أيضا الكثير من أنواع المراجع، ولكن أيضا الكثير من مراحل التجهيز، ويتم نقل الرأس. لا تقلق، يونيو النجم Regulus أول اطلالة له في ذلك الوقت، أيضا، حتى الآن يديه لكتابة هذا المقال، ولكن أيضا مرارا وتكرارا طعم المصدر، شهادة بحث بعد تمشيط بشكل واضح.

ثم نحن تسوية الوضع من كل نوع من المراجع في مختلف مراحل هذه:

المراجع المرنة

  • المرحلة الأولى: وجوه لم يعد صالحا، وفقا لقرار سياسي أم لا لإزالته من القائمة لتنظيفها

  • المرحلة الثانية: ويشير الكائن أيضا لبقاء المراجع شطبها من قائمة لتنظيفها

  • المرحلة الثالثة: إذا كان المرحلة الأولى من تنظيف قررت المراجع نظيفة وناعمة، ثم إلى المرحلة الثالثة فارغة إشارة الغازية المتبقية، قطع الاتصال مع كائن آخر، وإذا كان المرحلة الأولى من تنظيف قررت عدم تنظيف المراجع لينة، قائمة بعد ذلك إلى المرحلة الثالثة، يتم تنظيفها فارغة، يتم الاحتفاظ المراجع المرنة.

  • والخلاصة: أن يكون إلا نقطة مرجعية لينة من الجسم، عند تنظيفها، وهذا يتوقف على تنظيف، تتبع، اعتمادا على الاستخدام الحالي للمساحة كومة

إشارات ضعيفة

  • المرحلة الأولى: لا يوجد علاج، إلا أن المرحلة الأولى من المراجع لينة العلاج

  • المرحلة الثانية: ويشير الكائن أيضا لبقاء المراجع شطبها من قائمة لتنظيفها

  • المرحلة الثالثة: بقية إشارة ضعيفة إلى كائن لم تعد على قيد الحياة، وضعف فارغة المرجعية، قطع الاتصال مع كائن آخر

  • والخلاصة: أن يكون إلا إشارة ضعيفة لافتا إلى كائن، كان GC أول تنظيف

اقتبس كاذبة

  • المرحلة الأولى: لا يوجد علاج، إلا أن المرحلة الأولى من المراجع لينة العلاج

  • المرحلة الثانية: ويشير الكائن أيضا لبقاء المراجع شطبها من قائمة لتنظيفها

  • المرحلة الثالثة: بقية الإشارة الوهمية إلى كائن لم تعد على قيد الحياة، وضعف فارغة المرجعية، قطع الاتصال مع كائن آخر

  • والخلاصة: أن يكون إلا نقطة مرجع كائن الافتراضية، وهي المرة الأولى تمت تبرئة أنه GC

Q5: بعد نقل الكائن، ما يشير إلى كيفية إصلاح؟

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

وبطبيعة الحال يمكن أن نفكر في هذا السؤال: عندما تحرك الكائن يوم الاثنين نقلا عن كيفية إصلاح؟

قبل الإجابة عن هذا السؤال، دعونا ننظر في جاوة، والمراجع في نهاية المطاف هو كيفية "نقطة" إلى كائن. في تاريخ JVM، هناك خياران:

الخيار الأول: التعامل مع

مرجع نفسه لا يشير مباشرة إلى كائن، عنوان الكائن هناك جدول، قيمة المؤشر المرجعي نفسها ليست سوى إدخالات جدول الجدول. أن أقتبس هنا "في عمق فهم من آلة جافا الافتراضية"، وهو الكتاب مع الصور:

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

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

وميزة هذا النهج واضحة، بعد نقل الكائن، كل ما يشير إلى نفسه دون تعديل، تحتاج فقط لإصلاح هذا الجدول المقابلة عنوان الهدف.

هو أيضا عيوب واضحة، والهدف من هذه الزيارة من خلال الذهاب الى "تحويل الترجمة"، سوف تتعرض للخطر على الأداء.

الخيار الثاني: المؤشر المباشر

الخيار الثاني هو مؤشر مباشر من الطريق، لا وسطاء جعل الفارق، المرجع هو في حد ذاته مؤشر. اقتباس من جديد حول "فهم متعمق للآلة جافا الافتراضية"، وهو الكتاب مع الصور:

وعلى النقيض من ذلك، فإن كلا من مزايا وعيوب الصرف.

الفوائد: الوصول المباشر إلى كائن أكثر من ذلك، وأداء أسرع. السلبيات: تحرك الكائن ونقلت عناء أعمال الترميم.

مثلت بؤرة مع اختار JVM التجارية الحديثة النهج المباشر إلى مؤشر كائن للوصول إلى الموقع.

تحتاج إلى تعديل القيمة الموجودة من جميع الإشارات في هذا الطريق، وحجم العمل كبير جدا.

لحسن الحظ، في هذا Q3 الربع الثالث: كيف يمكنني العثور على جذور GC؟ OopMap صفها لعبت مرة أخرى المنقذ من الهوية.

المعلومات المخزنة OopMap أن أقول JVM، في الأماكن التي يوجد ما يشير إلى هذه المعلومات الهامة، ليس فقط لإيجاد جذور GC جمع القمامة، ولكن أيضا مرشدا هاما للإشارة إلى تصحيح.

إشارة

  • RednaxelaFX: معرفة على المكدس مؤشر / مرجع

كتب في الماضي

وأرجو من الجميع قراءة هذا المقال يعرف فقط كيف GC في حد ذاته هو شيء واحد، ولكن أيضا العمل من وراء الكواليس يمكن أن تكون أكثر من ذلك بقليل فهم من GC، GC جدا والمقابلة تحدثت حول متى يمكنك يضحك ~ أكثر عدة جولات من الحرب

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

ثلاث شركات سيحل حزمة المستخدم القديمة والجديدة قضية حقوق مختلفة، المحموم التعاون مع الأهتزاز، بوابة 2.26 الإفراج | المهوسون العناوين

كيفية تغيير الحياة البشرية في التفاعل بين الإنسان -الحاسوب | مليون شخص يتعلمون الذكاء الاصطناعي

فقدت 30 مليون $ bitcoins نقدا، لأن بطاقة SIM؟

دفتر الملاحظات الذي دمرته زوكربيرج ، يخفي كل النجاح أو فشل الفيسبوك

حزب المؤتمر SISHUI الشعبية فرع "العلامة التجارية شجرة لعرض القلب والروح للمساعدة على الخروج من الفقر".

"التحفة" في وسط العزلة

الحوار ووهان كمتطوع الفرنسية: شرب الدواء تعزيز الحماية، وعاء من المعكرونة الجافة لقاء

وصل أكثر من 900 موظف في جينغتشو، وهوبى ودونغ قوان، سكرتير الحزب وموقع رئيس بلدية الوصول

أول رحلة العودة إلى العمال المهاجرين هوبى العودة إلى العمل القطار عميق وصل! نقطة التسليم دقيقة 169 موظف

G4368 قطار خاص: هوبى قطار إعادة صياغة ملزمة للرحلة الأولى في قوانغدونغ

أستراليا باء الترقية: الشراء من السوبر ماركت ويأكلون الوجبات السريعة لمدة 14 يوما، 20000 طالب أجنبي دراسة الطب أو معركة

باء الجمهور 60 يوما ملاحظة: أبلغ شانغهاي وشاندونغ في كثير من الأحيان، وقوانغدونغ استيراد الحالات خارج غرامة المسار