جلوگیری از نشت حافظه ناشی از سوء استفاده از APIهای Microsoft.Extensions.Configuration در NET.
نویسنده: وحید نصیری
تاریخ: ۱۴۰۴/۰۳/۰۱ ۰۹:۳۳
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
Microsoft.Extensions.Configuration است. این مشکل میتواند هم در برنامههای جدید و هم در برنامههایی که از .NET 6 یا پایینتر به .NET 7 یا بالاتر بهروزرسانی شدهاند، بروز پیدا کند. درک مکانیسم این نشت و نحوه شناسایی و رفع آن برای توسعهدهندگان .NET حیاتی است.OutOfMemoryException: در صورت تداوم رشد حافظه برای مدت طولانی، ممکن است برنامه با خطای OutOfMemoryException مواجه شده و دچار افت عملکرد شود.System.Byte[] پینشده (Pinned) و System.IO.FileSystemWatcher+AsyncReadState مشاهده میشود.File Change Events) در Microsoft.Extensions.Configuration باز میگردد. برخی از ارائهدهندگان پیکربندی (Configuration Providers) مانند FileConfigurationProvider که از فایلها برای بارگذاری تنظیمات استفاده میکنند، برای تشخیص تغییرات در فایلهای پیکربندی، از FileSystemWatcher استفاده میکنند. این FileSystemWatcher یک شیء AsyncReadState را ایجاد میکند که شامل یک byte[] پینشده است. اگر نمونههای IConfiguration یا IConfigurationRoot به درستی رها (Disposed) نشوند، FileSystemWatcher نیز رها نمیشود و در نتیجه AsyncReadState و byte[] پینشده آن در حافظه باقی میمانند. این امر منجر به تجمع تدریجی اشیاء byte[] پینشده و بلوکهای حافظه غیرقابل استفاده در Gen2 میشود. این وضعیت در سناریوهایی که برنامه به طور مکرر نمونههای جدیدی از IConfiguration را ایجاد و بارگذاری میکند (مانند خواندن تنظیمات برای هر درخواست HTTP بدون استفاده از تزریق وابستگی یا مدیریت طول عمر مناسب)، تشدید میشود.IConfiguration: در ASP.NET Core و برنامههای .NET، IConfiguration باید به عنوان یک سرویس تکزی (Singleton) یا محدود به طول عمر درخواست (Scoped) تزریق شود و از ایجاد نمونههای جدید آن در هر بار استفاده خودداری شود. این اطمینان حاصل میکند که یک نمونه واحد از IConfiguration در طول عمر برنامه یا درخواست مورد استفاده قرار میگیرد و از ایجاد مکرر FileSystemWatcher جلوگیری میشود.IConfiguration به صورت دستی و مکرر: از کدنویسیهایی که به طور مکرر و دستی IConfiguration یا ConfigurationBuilder را برای خواندن تنظیمات ایجاد میکنند، خودداری کنید. به جای آن، از نمونههای موجود که از طریق تزریق وابستگی در دسترس هستند، استفاده کنید.FileSystemWatcher: اگر به طور مستقیم از FileSystemWatcher استفاده میکنید، مطمئن شوید که پس از اتمام نیاز به آن، شیء را به درستی Dispose میکنید. این کار میتواند با استفاده از الگوی using یا فراخوانی صریح متد Dispose() انجام شود. FileSystemWatcher یک منبع سیستم عامل است و باید به درستی آزاد شود تا از نشت منابع و حافظه جلوگیری شود.Microsoft.Extensions.Configuration، بهویژه در نسخههای جدیدتر .NET در ویندوز، یک مشکل جدی است که میتواند بر پایداری و عملکرد برنامه تأثیر منفی بگذارد. این مشکل با تجمع اشیاء System.Byte[] پینشده و غیرقابل استفاده در Gen2 هیپ GC مشخص میشود که اغلب توسط نمونههای FileSystemWatcher که به درستی رها (Disposed) نشدهاند، نگهداری میشوند. با رعایت بهترین شیوهها در مدیریت پیکربندی، استفاده صحیح از تزریق وابستگی، و مدیریت دقیق منابع سیستم مانند FileSystemWatcher، توسعهدهندگان میتوانند از بروز این نشت حافظه جلوگیری کرده و برنامههای .NET با کارایی و پایداری بالا را توسعه دهند. مانیتورینگ و تحلیل مداوم حافظه نیز ابزارهای ضروری برای شناسایی و رفع زودهنگام این گونه مسائل هستند.