الأجزاء الداخلية لجمع البيانات المهملة
Tri-color mark-sweep وGOGC وإيقافات GC المؤقتة
الأجزاء الداخلية لجمع البيانات المهملة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
خوارزمية التعليم والمسح ثلاثية الألوان
يستخدم GC في Go خوارزمية متزامنة للتعليم والمسح ثلاثية الألوان. تكون الكائنات بيضاء (لم تُزَر)، أو رمادية (عُثر عليها لكن لم تُفحص عناصرها التابعة)، أو سوداء (فُحصت بالكامل). وتكون الكائنات البيضاء نفايات عند إجراء المسح.
GC المتزامن
يعمل GC في Go بالتزامن مع goroutines الخاصة بالتطبيق في معظم الوقت. ويقلل ذلك فترات إيقاف العالم (STW) إلى مدد أقل من ميلي ثانية في معظم البرامج.
حاجز الكتابة
يعترض حاجز الكتابة عمليات كتابة المؤشرات أثناء مرحلة التعليم المتزامنة للحفاظ على الثابت الذي يمنع الكائنات السوداء من الإشارة إلى كائنات بيضاء. ويضيف ذلك تكلفة صغيرة إلى كل عملية كتابة مؤشر.
مراحل STW
توجد فترتا إيقاف قصيرتان للعالم STW في كل دورة GC: (1) إعداد التعليم (تمكين حاجز الكتابة وأخذ لقطة من مكدسات goroutine)، (2) إنهاء التعليم (ضمان فحص جميع الكائنات الرمادية). تكون P99 عادةً <1ms.
GOGC
يتحكم GOGC في مُشغّل GC (وقيمته الافتراضية 100). ويعني ذلك «تشغيل GC عندما يتضاعف حجم الكومة الحية مقارنةً بحجمها بعد عملية GC السابقة». يؤدي ضبط GOGC=50 إلى تشغيل GC بوتيرة أعلى مع استخدام ذاكرة أقل؛ بينما يؤدي GOGC=200 إلى تشغيله بوتيرة أقل مع استخدام ذاكرة أكبر.
GOMEMLIMIT
يحدّد GOMEMLIMIT (في Go 1.19 والإصدارات الأحدث) حدًا ناعمًا للذاكرة. عندما تقترب الكومة من هذا الحد، يعمل GC بوتيرة أكبر بغضّ النظر عن قيمة GOGC. استخدمه لمنع عمليات إنهاء OOM في البيئات المقيّدة بالذاكرة.
import "runtime/debug"
debug.SetMemoryLimit(512 * 1024 * 1024)ضبط الإيقاع
يضبط GC إيقاعه بحيث ينتهي من التعليم قبل امتلاء الكومة مقارنةً بقيمة GOGC. وإذا كان معدل التخصيص مرتفعًا، فإنه يزيد عدد goroutines التي تساعد في التعليم (mark assists).
runtime.GC()
يؤدي استدعاء runtime.GC() إلى فرض دورة GC فورية. يكون ذلك مفيدًا في الاختبارات لضمان تشغيل finalizers، أو في اختبارات الأداء لبدء التنفيذ بكومة نظيفة. لا تستدعِه في بيئة الإنتاج.
Finalizers
سجّل دالة لتشغيلها عند جمع كائن بواسطة جامع القمامة باستخدام runtime.SetFinalizer. تعمل finalizers في goroutine مخصّصة بعد GC. تجنّب استخدامها لتنظيف الموارد، واستخدم أساليب Close() بدلًا منها.
مقاييس GC
اقرأ إحصاءات GC من runtime.ReadMemStats أو اعرضها عبر مقاييس Prometheus. الحقول المهمة هي: NumGC وPauseNs وHeapAlloc وHeapInuse.
var m runtime.MemStats
runtime.ReadMemStats(&m)
fmt.Printf("GC cycles: %d, last pause: %dns\n", m.NumGC, m.PauseNs[(m.NumGC+255)%256])مستصلح الذاكرة
يعيد مستصلح يعمل في الخلفية ذاكرة الكومة الخاملة إلى نظام التشغيل. يعمل بالتزامن، ويضبط إيقاعه بحيث لا يؤثر في أداء العمليات الأمامية. ويُستخدم استدعاء النظام MADV_FREE أو MADV_DONTNEED.
تحقق سريع
ماذا يفعل GOMEMLIMIT في Go 1.19 والإصدارات الأحدث؟
مراجعة: آليات GC الداخلية
النقاط الأساسية:
- تعليم ومسح متزامنان بثلاثة ألوان، مع توقفين قصيرين من نوع STW
- يتحكم GOGC في نسبة نمو الكومة؛ والقيمة الافتراضية هي 100، إذ يؤدي نمو بنسبة 100% إلى تشغيل GC
- استخدام GOMEMLIMIT لضمان سلامة الذاكرة في الحاويات (في Go 1.19 والإصدارات الأحدث)
- استخدام runtime.ReadMemStats للحصول على مقاييس GC
الأسئلة الشائعة
هل درس «الأجزاء الداخلية لجمع البيانات المهملة» مجاني؟
نعم — نص درس «الأجزاء الداخلية لجمع البيانات المهملة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأجزاء الداخلية لجمع البيانات المهملة»؟
Tri-color mark-sweep وGOGC وإيقافات GC المؤقتة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «الأجزاء الداخلية لجمع البيانات المهملة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المكدس مقابل الكومة وتحليل الهروب
- نموذج ذاكرة Go وترتيب Happens-Before
- الأجزاء الداخلية لجمع البيانات المهملة
- تقليل التخصيصات: sync.Pool وArenas