این بخش وارد جزئیات مهمی از نحوهی تشخیص محل اشارهگرها (pointers) در حافظه توسط Garbage Collector در Go میشود. در ادامه توضیح مختصر و مفیدش 👇
📘 Heap Bits و Malloc Header در Go Runtime
🔹 در زبان Go، Garbage Collector (GC) باید بداند کدام قسمت از یک شیء شامل pointer است تا بتواند به درستی گراف حافظه را پیمایش کند.
اما بررسی تکتک فیلدهای هر struct در زمان اجرا (runtime) بسیار پرهزینه خواهد بود، مخصوصاً برای ساختارهای بزرگ یا تو در تو.
💡 راهحل Go: استفاده از متادیتا (Metadata)
برای حل این مشکل، Go از دو سازوکار اصلی استفاده میکند:
1. Heap Bits
* برای هر ناحیه از حافظهی heap، اطلاعاتی بهصورت بیتفیلد ذخیره میشود که مشخص میکند
هر بخش از آن حافظه شامل pointer است یا دادهی معمولی (non-pointer).
* این بیتها توسط کامپایلر در زمان کامپایل ساخته و در زمان اجرا توسط GC استفاده میشوند.
* نتیجه: GC میتواند مستقیماً بداند کدام قسمتها را باید دنبال کند، بدون نیاز به اسکن کل struct.
2. Malloc Header
* هر شیء در heap یک هدر (header) دارد که اطلاعات مدیریتی مثل اندازه، نوع و آدرس بیتهای مربوط به آن (heap bits) را نگهداری میکند.
ا * GC از این هدر برای دسترسی سریع به متادیتای مورد نیاز در زمان جمعآوری حافظه استفاده میکند.
⚙️ نتیجه
با ترکیب heap bits و malloc header**، GC در Go میتواند:
* تنها بخشهای لازم را اسکن کند (به جای کل حافظه)
* با سرعت و دقت بالا گراف اشیاء را پیمایش کند
* و در عین حال، **کارایی بالایی در مدیریت حافظه حفظ کند.
✅ خلاصه:
اGo با استفاده از *Heap Bits* و *Malloc Header*، مکان pointerها را از پیش میداند و به این ترتیب، فرآیند جمعآوری زباله را بسیار سریع و بهینه انجام میدهد — بدون نیاز به بررسی تکیتکی فیلدها در زمان اجرا.
➖➖➖➖➖➖➖➖
👑 @gopher_academy
Post #4285
323
Gopher Academy 📌 Memory Allocation in Go ❌این پست اپدیت میشود ❌ 🔹 در این پست به بررسی جزئیات مدیریت حافظه در زبان Go میپردازیم. درک درست از ساختار حافظه به شما کمک میکند عملکرد برنامههایتان را بهتر بهینه کنید و رفتار Garbage Collector را بهتر بفهمید. 🔵 Introduction…
- ❤ 1
- 💋 1