Runtime: فشل GC المتزامن في العمل بشكل متزامن

تم إنشاؤها على ٩ أغسطس ٢٠١٩  ·  3تعليقات  ·  مصدر: dotnet/runtime

أرى مشكلة عرضية على netcore 2.2 حيث يبدو أن Gen2 GC المتزامن لا يعمل على مؤشر ترابط GC في الخلفية ، وبدلاً من ذلك يعمل على الخيط الذي أدى إلى تشغيل المجموعة.

تمت ملاحظة ذلك في تطوير Windows 10 الخاص بي الذي يقوم بتشغيل تطبيق في تكوين الإصدار على وقت تشغيل .NET Core 2.2 64 بت مع ملف تعريف GC الافتراضي (محطة العمل ، وتمكين GC المتزامن ، ووضع زمن الانتقال التفاعلي) ، وتمكنت من الحصول على عينة perfview من الحدوث:

blockingConcurrentGC

بالنظر إلى مصدر GC ، أعتقد أنه قد تكون هناك مشكلة تم تقديمها في هذا الالتزام . قبل التغيير ، سيتم تعيين bgc_thread في وقت إنشاء سلسلة الرسائل ، وسيتم ضمان تعيينها بحلول الوقت الذي يتم فيه التحقق في void gc_heap::garbage_collect (int n) . بعد التغيير ، تم تعيين bgc_thread الآن ضمن مؤشر ترابط جديد في بداية تنفيذه ، والذي يبدو أنه سيقدم حالة سباق حيث قد لا يتم تعيين هذا الحقل في الوقت المناسب لمواصلة GC المتزامنة.

area-GC-coreclr question

التعليق الأكثر فائدة

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

ال 3 كومينتر

آه ، بحث جيد!
PeterSolMS ، VSadov هل من فضلك

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

لسباق إعداد bgc_thread ، لا نحتاج في الواقع إلى تعيينه في bgc_thread_stub ، في CreateSuspendableThread بعد هذا السطر

args.Thread = SetupUnstartedThread(FALSE);

كائن Thread متاح بالفعل - كل المنطق اللاحق في هذه الوظيفة لا يغير الخيط الذي تم إنشاؤه على أي حال.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات