5 روش برای جلوگیری از اجرای اتوماتیک Garbage Collection

دانلود رایگان مقاله کامل با فرمت PDF (حجم 461 کیلو بایت)

Garbage Collector یکی از درخشان ترین دستاوردها در مهندسی نرم افزار است ، اما گاهی در زمانهای نامناسبی رخ می دهد. اگر شما نیاز دارید تا کدهای با کارایی بالا و Real-Time بنویسید ، معمولا نیاز دارید تا از GC در مورد collection ها جلوگیری کنید زمانی که سرعت اجرا به طور بحرانی مورد اهمیت باشد. البته گاهی GC غیر قابل جلوگیری است ، که در این صورت مینیمایز کردن مدت اجرای هر collection بهترین گزینه است . یک هم پوشانی یا overlap بین بهینه سازی مینیمایز کردن فرکانس GC و بهینه سازی مینیمایز کردن زمان عمل کردن GC وجود دارد که میتوانند با یک دیگر در تعارض هم باشند . فهمیدن نحوه ی memory management در .NET می تواند به شما در مورد انتخاب یکی از این دو راه کمک کند ، اما بهترین راه برای اینکه بفهمید چه چیزی باعث اجرا شدن garbage collector میشود این است که از ابزارهای آنالیز memory مثل ANTS Memory Profiler استفاده کنید .

بین Typeهای Value و Reference تفاوت قائل شوید

در .NET دو نوع تایپ وجود دارد : تایپهای Value و تایپهای Reference . تفاوت بین این دو در نهایت در نحوه ی ذخیره سازی اطلاعات آنها ست . یک نمونه از تایپ value اطلاعات را در خودش نگه میدارد ، درحالیکه یک نمونه از تایپ reference اطلاعات را در یک مرجع به مکانهایی از حافظه که اطلاعاتش در آن قرار دارد را در خودش نگه میدارد . به همین خاطر یک تایپ از نوع value در بدترین حالت کمترین تاثیر را روی garbage collection میگذارد .در حقیقت تایپهای value اصلاً در هیپ GC وجود ندارند .

با استفاده از تایپهای مناسب از نوع value می توانید هم به جلوگیری از GC کمک کنید هم سرعت اجرای GC برای collectionها را زیادتر کنید .

بجای class از struct استفاده کنید

هنگامی که میخواهید یک type بسازید و از آن در یک آرایه یا یکی از collectionهای رایج استفاده کنید ، از struct استفاده کنید . هنگامی که GC اجرا میشود ، فقط تایپهای reference را چک میکند تا ببیند آیا هنوز قابل دسترس هستند یا نه .

این مزیت برای یک struct خوب است ولی زمانی که یک آرایه از structها داریم بیشتر جلب نظر میکند . با یک آرایه از structها ، GC فقط چک میکند که ببیند آیا خود آرایه هنوز یک شیء در دسترس هست چون structها نمیتوانند باشند! Struct ها چند مشکل عمده دارند که زیاد وارد آنها نمی شویم .

با این وجود زمانی که میخواهید یک ساختمان داده که هزاران instance در آن ساخته میشوند ایجاد کنید و نمیتوانید برای آن یک pool از اشیاء بسازید ، یک struct میتواند یک مزیت عمده باشد برحسب کارایی GC و مینیمایز کردن GC اوتوماتیک .

Classها را طوری طراحی کنید که قابل استفاده مجدد باشند و بتوان از آنها یک pool مناسب از اشیاء درست کرد

صرف نظر از platform ، بیشتر اشیای مدیریت شده ، بجز آرایه ها و collectionهای رایج ، باید کوچک باشند تا استفاده مجدد از آنها مفید باشد . این کار باعث میشود تا از افزایش شمارنده داخلی تخصیص حافظه ی GC جلوگیری شود و این کمک می کند تا GC اجرا نشود . اشیایی که میخواید از آنها زیاد استفاده کنید را می توانید با متدهای public که با فراخوانی آنها شیء را دوباره مقدار اولیه میدهند طراحی کنید بجای اینکه constructorهای overload شده برای آن بنویسید .سپس از collectionهایی مانند List برای ایجاد pool از نمونه های اشیاء استفاده کنید .

این نکته را همیشه به خاطر داشته باشید که ایجاد pool در کدهایی که time critical هستند میتواند بسیار هزینه بر باشد اگر نتوانید از GC جلوگیری کنید .

از overloadهایی که ظرفیت اولیه ی collection را میگیرند استفاده کنید

به طور داخلی List ، Dictionary و دیگر collectionها ی رایج از یک یا چند آرایه با متغییری برای دنبال کردن تعداد آیتم های valid که در آرایه وجود دارد استفاده میکنند . هرموقع که یک آیتم به آن اضافه میشود و از ظرفیت آن آرایه داخلی تجاوز میکند ، یک آرایه جدید ساخته میشود و شمارنده داخلی تخصیص GC افزایش مییابد .

اگر تقریباً بدانید که چند عنصر در collection در هر زمان باید قرار بگیرد ، میتوانید از یکی از overload های constructorهای آن برای ایجاد آرایه های داخلی با سایز اولیه مشخص استفاده کنید .در نظر بگیرید ظرفیت داخلی را به اندازه ی کافی بزرگ انتخاب کرده اید و ارایه داخلی هیچ گاه دوباره resize نمیشود و این به آن معناست که دیگر نیازی به allocation جدید ندارید .

از operationهایی که موجب allocation میشوند آگاهی پیدا کنید

در .NET تعدادی operationهای رایج وجود دارد که باعث تولید GC allocation به میشوند . دوتا از آنها boxing و string ها هستند.

Boxing زمانی اتفاق می افتد که به طور explicit یک تایپ از نوع value به یک Interface تبدیل یا cast شود . درحالی که interface نمیتواند instantiate شود ، CLR با آنها هر بار که یک instance میگیرید همانند reference عمل میکند . یک حامل از نوع reference لازم است در زمانی که یک Object یا interface ساخته میشود برای نگه داری مقادیر تایپهای value نیاز است . با دانستن در مورد طرز عمل boxing میتوانید از impactionهایی که در حافظه رخ میدهد آگاه شوید .

String یکی از قوی ترین انواع reference در .NET هستند و در نتیجه با GC مدیریت میشوند .پس در طول ذخیره سازی در حافظه قابل تغییر نیستند . اما تعدادی operatorهای مجازی یا virtual وجود دارند که میتوانند string ها را تبدیل کنند و این باعث اجرای GC allocation میشود.
یک راه برای کمینه کردن allocationها که در نتیجه ی استفاده از operatorهای string بوجود می آیند، استفاده از System.Text.StringBuilder است . اما متاسفانه کلاسهای زیادی در .NET وجود ندارند که هم string بگیرند هم StringBuilder . با این حال هنوز هم میتوانید از StringBuilder برای ایجاد قسمتهای مختلف یک string استفاده کنید و از StringBuilder برای کم کردن allocationها استفاده کنید .

منبع :
5 Tips for Avoiding Automatic Garbage Collections

Advertisements

دربارهٔ DeltaCode

Somewhere near the sky Far away from people Far away from noise Somewhere near yourself

Posted on آوریل 5, 2012, in برنامه نویسی and tagged . Bookmark the permalink. 2 دیدگاه.

  1. با تشکر از مطلب خوبت فقط کاشکی برنامه ANTS Memory Profiler نسخه کاملش موجود بود خیلی بدرد می خوره

  2. من خودم استفاده نکردم ازش ولی اگر خواستی میتونی به خود سایت منبع که لینکش رو گذاشتم بری و دانلود کنی . این برنامه ها کامل سیستم رو آنالیز میکنند و به درد افراد حرفه ای می خورند ، من خورده پایی بیش نیستم .

    ممنون از توجه شما .

پاسخی بگذارید

در پایین مشخصات خود را پر کنید یا برای ورود روی شمایل‌ها کلیک نمایید:

نشان‌وارهٔ وردپرس.کام

شما در حال بیان دیدگاه با حساب کاربری WordPress.com خود هستید. بیرون رفتن / تغییر دادن )

تصویر توییتر

شما در حال بیان دیدگاه با حساب کاربری Twitter خود هستید. بیرون رفتن / تغییر دادن )

عکس فیسبوک

شما در حال بیان دیدگاه با حساب کاربری Facebook خود هستید. بیرون رفتن / تغییر دادن )

عکس گوگل+

شما در حال بیان دیدگاه با حساب کاربری Google+ خود هستید. بیرون رفتن / تغییر دادن )

درحال اتصال به %s

%d وب‌نوشت‌نویس این را دوست دارند: