عنوان:

‫بررسی ساختار، عملکرد و تفاوت‌های Heap مدیریت‌شده و مدیریت‌نشده و مدل نسل‌بندی (Generations) در Garbage Collection


نویسنده: امیر مکارچی
تاریخ: ۱۴۰۳/۱۲/۱۸ ۱۱:۴۵
آدرس: www.dntips.ir
مدیریت حافظه در محیط دات‌نت مبتنی بر دو مفهوم اصلی Heap مدیریت‌شده (Managed Heap) و Heap مدیریت‌نشده (Unmanaged Heap) استوار است. در این مطلب به تفصیل به بررسی ساختار، عملکرد و تفاوت‌های این دو مکانیسم پرداخته و مدل نسل‌بندی (Generations) در Garbage Collection را بررسی می‌کنیم.

۱. Heap مدیریت‌شده در برابر Heap مدیریت‌نشده


Heap مدیریت‌نشده (Unmanaged Heap)
تخصیص حافظه: توسط واسط‌های سیستمی مانند Windows API (نظیر VirtualAlloc) انجام می‌شود.
کاربرد: سیستم‌عامل و CLR (زمان اجرای زبان مشترک) از این حافظه برای ساختارهای داخلی خود استفاده می‌کنند.
محتوا: شامل حافظه موردنیاز برای فراخوانی‌های سیستمی، ساختارهای داده سیستم‌عامل و بخش‌های حیاتی CLR است.

Heap مدیریت‌شده (Managed Heap)
تخصیص حافظه: تمام اشیاء مبتنی بر چارچوب دات‌نت در این بخش ذخیره می‌شوند.
مدیریت: مسئولیت مدیریت این حافظه بر عهده Garbage Collector (GC) است.

۲. ساختار Heap مدیریت‌شده

Heap مدیریت‌شده به دو بخش اصلی تقسیم می‌شود:
الف) Small Object Heap (SOH)
  • هدف: ذخیره‌سازی اشیاء با حجم کمتر از ۸۵,۰۰۰ بایت.
  • ساختار: از چندین سگمنت (Segment) حافظه تشکیل شده است.
ب) Large Object Heap (LOH)
  • هدف: اختصاص به اشیاء با حجم بیش از ۸۵,۰۰۰ بایت.
  • ساختار: ممکن است شامل چندین سگمنت باشد، اما فشرده‌سازی (Compaction) در آن به‌صورت پیش‌فرض انجام نمی‌شود.

۳. مدل نسل‌ها در Garbage Collection

سیستم GC از یک مدل نسل‌بندی برای بهینه‌سازی فرآیند جمع‌آوری حافظه استفاده می‌کند:
نسل‌ها و ویژگی‌ها
  • Gen 0: نخستین محل ذخیره‌سازی اشیاء جدید است. این نسل مختص اشیاء با عمر کوتاه است.
  • Gen 1: اشیایی که پس از اجرای GC در Gen 0 باقی می‌مانند، به این نسل منتقل می‌شوند.
  • Gen 2: اشیاء با طول عمر بالا که پس از چندین چرخه GC هنوز مورد استفاده هستند.
ساختار سگمنت‌ها در نسل‌ها
  • Gen 0 و Gen 1 همواره در یک سگمنت واحد قرار می‌گیرند.
  • Gen 2 و LOH می‌توانند از چندین سگمنت تشکیل شوند.

۴. فرآیند Garbage Collection

فرآیند GC در چهار مرحله انجام می‌شود:
۱. تعلیق (Suspension):
  • توقف موقت تمام رشته‌های مدیریت‌شده جهت اجرای GC.
  • رشته‌های بومی (Native Threads) تنها در صورت ورود به کد مدیریت‌شده متوقف می‌شوند.
۲. علامت‌گذاری (Mark):
  • شناسایی اشیاء زنده از طریق ریشه‌ها (Roots) نظیر متغیرهای استاتیک، داده‌های روی پشته و اشیاء دارای Finalizer.
۳. فشرده‌سازی (Compaction):
  • یکپارچه‌سازی حافظه برای کاهش تجزیه (Fragmentation).
  • در LOH، فشرده‌سازی تنها در صورت درخواست صریح انجام می‌شود.
۴. ادامه اجرا (Resume):
  • ازسرگیری اجرای رشته‌های مدیریت‌شده.

۵. عوامل مؤثر در اجرای GC

  • رسیدن مصرف حافظه یک نسل به آستانه مشخص.
  • کمبود حافظه آزاد در سطح سیستم‌عامل.
  • کارایی جمع‌آوری در نسل‌های خاص (بهینه‌سازی مبتنی بر الگوی استفاده).
نکته کلیدی: زمان اجرای GC به تعداد اشیاء زنده وابسته است، نه به تعداد کل اشیاء ایجادشده.

جمع‌بندی و نتیجه‌گیری

  1. GC به‌عنوان هسته مرکزی مدیریت حافظه در دات‌نت، از مدل نسل‌بندی برای افزایش کارایی استفاده می‌کند.
  2. LOH به دلیل ذخیره‌سازی اشیاء بزرگ، به‌طور پیش‌فرض فشرده‌سازی نمی‌شود.
  3. زمانبندی GC مبتنی بر معیارهای پویایی نظیر مصرف حافظه و نیاز سیستم‌عامل است.
  4. درک عمیق از مکانیسم‌های GC می‌تواند به توسعه برنامه‌های دات‌نت با عملکرد بهینه کمک شایانی کند.
این تحلیل نشان می‌دهد که بهینه‌سازی مدیریت حافظه نه تنها وابسته به دانش فنی است، بلکه نیازمند درک تعامل بین اجزای CLR و سیستم‌عامل است.