المكدس مقابل الكومة وتحليل الهروب
كيفية تحديد Go لموضع تخصيص الذاكرة
المكدس مقابل الكومة وتحليل الهروب درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
التخصيص على المكدس
تُخصَّص المتغيرات المحلية التي لا تهرب من الدالة على مكدس goroutine. ويكون التخصيص على المكدس سريعًا (مجرد زيادة للمؤشر)، كما أن جمعه لا يكلّف شيئًا (إذ يُزال إطار المكدس عند العودة).
التخصيص على الكومة
تُخصَّص المتغيرات التي تهرب إلى الكومة باستخدام مخصّص Go، ويتتبعها جامع القمامة. ويكون التخصيص على الكومة أبطأ ويزيد الضغط على GC.
ما الذي يسبب الهروب؟
من أسباب الهروب الشائعة: أخذ عنوان متغير محلي وإعادته، أو تخزين متغير محلي في واجهة، أو إرساله عبر channel. ويحدد المترجم ذلك من خلال تحليل الهروب.
func newUser() *User { // *User escapes to heap
return &User{Name: "Alice"}
}go build -gcflags=-m
اطبع قرارات تحليل الهروب:
go build -gcflags="-m" .
// main.go:10:15: &User literal escapes to heap
// main.go:5:14: s does not escapeمكدسات goroutine
تبدأ كل goroutine بمكدس صغير (2 KiB في Go 1.14 والإصدارات الأحدث) ينمو ديناميكيًا حسب الحاجة. وتكون المكدسات منفصلة عن الكومة، ويُتخلّص منها عند انتهاء goroutine.
تجنب التخصيصات
مرّر القيم (لا المؤشرات) للبنى الصغيرة. استخدم مصفوفات مخصّصة على المكدس بدلًا من الشرائح عندما يكون الحجم معلومًا. أعد القيم بدلًا من المؤشرات لإبقائها على المكدس.
تغليف القيم في الواجهات
يؤدي إسناد قيمة ملموسة إلى واجهة إلى هروب القيمة إلى الكومة (boxing). في المسارات الساخنة، اقبل الأنواع الملموسة أو استخدم الأنواع العامة بدلًا من الواجهات.
sync.Pool
أعد استخدام الكائنات المخصّصة على الكومة باستخدام sync.Pool لتقليل الضغط على GC الناتج عن التخصيصات المتكررة للكائنات قصيرة العمر (مثل المخازن المؤقتة وسياقات الطلبات).
var pool = sync.Pool{New: func() any { return make([]byte, 1024) }}
buf := pool.Get().([]byte)
defer pool.Put(buf[:0])تنميط التخصيصات
استخدم go test -benchmem وتنميط الكومة مع -alloc_space للعثور على الدوال التي تخصّص أكبر قدر من الذاكرة.
slice مقابل array
قد تبقى مصفوفة صغيرة [N]T على المكدس. ويُخصَّص رأس الشريحة (24 بايتًا) على المكدس، لكن قد تهرب المصفوفة الداعمة لها. ويؤدي التخصيص المسبق باستخدام make إلى تجنب إعادة التخصيص المتكررة.
توحيد السلاسل النصية
لا تُخصَّص السلاسل النصية الحرفية على الكومة (بل توجد في مقطع البيانات للقراءة فقط). ويؤدي تحويل []byte إلى string إلى تخصيص. خزّن السلاسل المستخدمة بكثرة مؤقتًا لتجنب التحويلات المتكررة.
تحقق سريع
ما الذي يجعل متغيرًا محليًا يهرب من المكدس إلى الكومة؟
مراجعة: المكدس مقابل الكومة
النقاط الأساسية:
- المكدس: سريع، وجمع GC له بلا تكلفة؛ الكومة: أبطأ ويتتبعها GC
- يعرض go build -gcflags="-m" قرارات الهروب
- يؤدي تغليف الواجهات وأخذ عنوان المتغير المحلي والإرسال عبر channel إلى الهروب
- استخدم sync.Pool للكائنات التي تُخصَّص وتُهمَل باستمرار
الأسئلة الشائعة
هل درس «المكدس مقابل الكومة وتحليل الهروب» مجاني؟
نعم — نص درس «المكدس مقابل الكومة وتحليل الهروب» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «المكدس مقابل الكومة وتحليل الهروب»؟
كيفية تحديد Go لموضع تخصيص الذاكرة تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «المكدس مقابل الكومة وتحليل الهروب»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المكدس مقابل الكومة وتحليل الهروب
- نموذج ذاكرة Go وترتيب Happens-Before
- الأجزاء الداخلية لجمع البيانات المهملة
- تقليل التخصيصات: sync.Pool وArenas