PDA

View Full Version : مشکل با Memory Leak



n_behzad
جمعه 12 فروردین 1390, 11:24 صبح
سلام خدمت همه دوستان برنامه نویس.

مشکلی با یکی از برنامه هام دارم.
در این برنامه، از کامپانت های Telerik استفاده شده، مشکل این هست که، وقتی فرم ها رو Dispose می کنم، GC حافظه اون ها رو آزاد نمی کنه، هر فرم جدید که باز می کنم، هر Event ای که اتفاق میقته، مدام رم می ره بالا و بعد از بسته شدن فرم، رم نمیاد پایین.

توی این پروژه، 4 تا کلاس دارم، 3 تا فرم و کامپانت های Telerik، کل فرم ها هم Radform هست.

ممنون می شم دوستان کمک کنند.

emadfa
دوشنبه 22 دی 1393, 09:44 صبح
دوست عزیز سلام.

متاسفانه مشکل Memory leak در کامپوننت های 3rd-party بسیار بسیار بیشتر از کامپوننت های خود ویندوز دیده می شود و در این میان کامپوننت های شرکت Telerik بیشتر از سایر کامپوننت ها دچار این مشکل هستند. البته برای این مشکل چندین راه حل وجود دارد:

1) از نسخه 2014 کامپوننت Telerik استفاده کنید. اگر Release Note های تلریک را مطالعه کنید، متوجه می شوید که از نسخه 2010 تا 2014 تعداد زیادی Memory Leak کنترل های تلریک برطرف شده است.

2) تمام رویدادهایی را که در سازنده کلاس شما attach شده است را unattach کنید. این کار به سادگی از طریق عملگر =- امکان پذیر است.

3) تمام اشیایی که از منابع استفاده می کنند (مثل اشیایی که با پایگاه داده، فایل ها و ... در ارتباط هستند) را برابر null قرار دهید.

4) تابع ()GC.Collect همیشه به عنوان یک راه حل مطرح نیست اما تحت شرایط خاصی با اجبار GC به آزاد سازی حافظه heap، اشیای خاصی را در اولویت برای آزادسازی بعدی قرار می دهد.

5) در هنگام فراخوانی فرم برنامه، بهتر است آن را در داخل یک عبارت using قرار دهید تا پس از این بلاک، تابع Dispose فراخوانی شود.

6) منابع زیر به شما در چگونگی پیاده سازی تابع Dispose کمک خواهد کرد:

http://www.codeproject.com/Articles/413887/Understanding-and-Implementing-IDisposable-Interfa

http://www.codeproject.com/Articles/15360/Implementing-IDisposable-and-the-Dispose-Pattern-P

موفق باشید.