عنوان:

‫تنظیم Garbage Collector در NET. برای عملکرد بالا


نویسنده: وحید نصیری
تاریخ: ۱۴۰۳/۱۱/۲۹ ۰۹:۰۱
آدرس: www.dntips.ir
این مقاله در مورد بهینه‌سازی عملکرد برنامه‌های NET. از طریق تنظیم Garbage Collector (GC) بحث می‌کند.

Garbage Collector .NET چیست؟

  • حافظه را با آزاد کردن خودکار اشیاء بلااستفاده مدیریت می‌کند.
  • از یک مدل نسلی استفاده می‌کند:
    • نسل 0: اشیاء با عمر کوتاه.
    • نسل 1: اشیاء بازمانده از جمع‌آوری نسل 0.
    • نسل 2: اشیاء با عمر طولانی.
  • می‌تواند باعث بروز مکثی در طول جمع‌آوری شود.

چرا GC را تنظیم کنیم؟

  • تنظیمات پیش‌فرض ممکن است برای برنامه‌های با عملکرد بالا بهینه نباشند.
  • برای موارد زیر حیاتی است:
    • برنامه‌های با تأخیر کم (به عنوان مثال، بازی‌ها، پلتفرم‌های معاملاتی).
    • برنامه‌های با توان عملیاتی بالا (به عنوان مثال، حجم درخواست‌های زیاد).

حالت‌های GC

    • GC ایستگاه کاری (Workstation GC): برای برنامه‌های دسکتاپ/کلاینت طراحی شده است.
    • برای عملکرد تک رشته‌ای و پاسخگویی بهینه شده‌است.
    • GC سرور (Server GC): ایده‌آل برای برنامه‌های چند رشته‌ای با توان عملیاتی بالا.
    • از چندین رشته برای جمع‌آوری استفاده می‌کند.
    • توان عملیاتی را بر پاسخگویی اولویت می‌دهد.
  • حالت را می‌توان در runtimeconfig.json یا به صورت برنامه‌نویسی تنظیم کرد.

استراتژی‌های تنظیم

  • حالت GC مناسب را انتخاب کنید: ایستگاه کاری برای رابط کاربری/تک رشته‌ای، سرور برای بک‌اند/چند رشته‌ای.
  • رویدادهای GC را نظارت کنید: از ابزارهایی مانند dotnet-trace، PerfView یا Visual Studio Profiler برای شناسایی جمع‌آوری‌های مکرر نسل 2 یا زمان‌های مکث بالا استفاده کنید.
  • فشار تخصیص را کاهش دهید: ایجاد شیء را به حداقل برسانید، از اشیاء مجدداً استفاده کنید (به عنوان مثال، دسته‌بندی شیء)، در صورت لزوم ساختارها را به کلاس‌ها ترجیح دهید.
  • از Span و Memory استفاده کنید: از آن‌ها برای کار با برش‌های داده بدون تخصیص حافظه استفاده کنید.
  • پین کردن اشیاء بزرگ: از آن برای کاهش تکه‌تکه شدن Heap اشیاء بزرگ (LOH) استفاده کنید.
  • تنظیم GC همزمان: با متغیرهای محیطی (به عنوان مثال، DOTNET_GCHeapCount، DOTNET_GCLatencyLevel) آن‌را تنظیم کنید.
  • از Finalizerها اجتناب کنید: سربار ایجاد می‌کنند. فقط در صورت لزوم استفاده کنید و سبک نگه دارید.

مثال عملی (API وب با توان عملیاتی بالا)

  • استفاده از GC حالت سرور.
  • تخصیص‌ها را کاهش دهید (به عنوان مثال، از StringBuilder استفاده کنید).
  • با استفاده از ابزارهایی مانند dotnet-counters نظارت و تنظیم کنید.

نتیجه‌گیری

تنظیم مؤثر GC مستلزم درک حجم کاری برنامه، انتخاب حالت GC صحیح و مدیریت استفاده از حافظه‌است. این روش‌ها عملکرد برنامه NET. را به حداکثر می‌رسانند.


مشاهده مطلب اصلی