Green Tea، جمعکنندهٔ زبالهٔ پیشفرض Go 1.26
خلاصهٔ کاملتر
فیل ایتون تو این مقاله سراغ Green Tea میره، جمعکنندهٔ زبالهٔ جدید Go که تو نسخهٔ Go 1.25 معرفی شد و تو Go 1.26 بهعنوان پیشفرض فعال شده. به نوشتهٔ نویسنده، هدف Green Tea کشدوستی بیشتر موقع پیمایش هیپه، ولی یه محدودیت قدیمی سر جاش مونده: کالکتور Go اشیا رو جابهجا نمیکنه، پس نمیتونه صفحههای خلوت رو پس بگیره.
برای اینکه ماجرا دیدنی بشه، اول یادآوری میکنه Go حافظه رو چطور میده: اندازهٔ هر شیء به نزدیکترین «کلاس اندازه» گرد میشه و شیء توی یه اسپن پیوسته از صفحههای ۸ کیلوبایتی، کنار هماندازههای خودش میشینه. این تخصیص اندازهمحور تو بعضی پیادهسازیهای malloc هم رایجه — مثل tcmalloc که آلوکیتور Go ازش مشتق شده.
بعد یه برنامهٔ کوچیک مینویسه که صد شیء از سه اندازهٔ مختلف (۳۲، ۶۴ و ۱۲۸ بایت) میسازه، آدرسشون رو مرتب میکنه و فضای آدرس رو کاراکتربهکاراکتر میکشه — هر کاراکتر ۳۲ بایت. خروجی دقیقاً همون چیزیه که تئوری میگفت؛ هر اندازه یه ناحیهٔ جدا برای خودش داره:
=== pass 0 (base 0xba4841580c0) ===
0xba4841580c0 M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-M-
0xba48415bcc0 ............................SSSSSSSSSSSSSSSSSSSS
0xba4841add40 ..........................L---L---L---L---L---L-نکتهٔ مهم اینه که پاس بعدی، یعنی بعد از فراخوانی صریح runtime.GC()، عیناً همون نقشه رو میده: هیچ شیئی تکون نخورده. نویسنده همین آزمایش رو با C# هم تکرار میکنه تا تفاوت یه کالکتور جابهجاکننده با مدل Go روشن بشه.
جمعبندی مقاله اینه که Green Tea رفتار کش و هزینهٔ پیمایش رو بهتر کرده، ولی چون هنوز غیرجابهجاکنندهست، برنامههایی که بعد از آزاد شدن بیشتر اشیا فقط چندتا شیء پراکنده روی صفحهها باقی میذارن، عملاً حافظهشون به سیستمعامل برنمیگرده.
نکات کلیدی:
- Green Tea از Go 1.25 اومد و تو Go 1.26 پیشفرض شد
- تخصیص Go اندازهمحوره: اشیای همکلاس تو اسپنهای پیوسته از صفحههای ۸ کیلوبایتی کنار هم میشینن
- نقشهٔ هیپ نشون میده بعد از GC هیچ شیئی جابهجا نمیشه، برخلاف C#
- ضعف باقیمونده: صفحههای خلوت با کالکتور غیرجابهجاکننده آزاد نمیشن




