چگونه از نشت حافظه (memory leak) در اندروید جلوگیری کنیم؟
نشت حافظه(memory leak) یکی از مشکلات رایج در برنامهنویسی اندروید است که میتواند باعث کاهش کارایی برنامه و حتی کرش آن شود. در واقع، هر بار که یک برنامه در حافظهی دستگاه اجرا میشود، مقداری از حافظه به برنامه اختصاص داده میشود. اگر برنامه درست طراحی نشده باشد و منابع مصرفی آن به درستی آزاد نشوند، ممکن است باعث نشت حافظه شود.
در این مقاله از سری مقالات برنامه نویسی اندروید اومدیم در مورد مشکل نشت حافظه (memory leak) و راه های جلوگیری از اون صحبت کنیم. پس با سایت ترولرن همراه باش.
“قبل از شروع مقاله، بگم که بعد از مطالعه این مطلب، از آموزش پروژه محور برنامه نویسی اندروید سایتمون یعنی دوره ژنرال اندروید غافل نشید.”
نشت حافظه(memory leak) در اندروید چیست؟
زمانی نشت حافظه در اندروید به وقوع میپیوندد که در آن یک بخش از حافظه برنامه بهطور نامحسوسی اشغال شده و پس از اتمام استفاده از آن، بهجای آزاد کردن حافظه و بازگرداندن آن به سیستم، در حافظه باقی میماند. با افزایش تعداد نشتهای حافظه، حجم حافظه پر میشود و سیستم مجبور به استفاده از حافظه یادگیری اضافی برای ذخیره دادههای جدید است. این ممکن است باعث کاهش کارایی سیستم شود و در نتیجه، سیستم کند و ناپایدار شود.
نشت حافظه (memory leak) معمولا در سه حالت رخ میدهد:
- تخصیص غیرضروری حافظه: بعضی اوقات برنامهنویسان برنامههایی طراحی میکنند که بیش از حد حافظه را تخصیص میدهند. این موضوع ممکن است باعث نشت حافظه شود زیرا حافظهای که تخصیص داده شده است، باید در نهایت آزاد شود. اگر حافظه بیش از حد تخصیص داده شود، ممکن است برنامه نتواند آن را آزاد کند.
- عدم آزادسازی منابع: برنامهنویسان باید تمامی منابعی که در طول زمان اجرای برنامه استفاده میشوند، مانند فایلها، دیتابیسها، شیها و غیره، را آزاد کنند. اگر منابعی که برنامه استفاده میکند، درست آزاد نشود، ممکن است باعث نشت حافظه شود.
- استفاده از شیهای غیرضروری: برنامهنویسان باید از شیهایی که برنامه به طور فعال استفاده نمیکند، خودداری کنند. استفاده از شیهای غیرضروری ممکن است باعث نشت حافظه شود زیرا این شیها نیاز به حافظه دارند و اگر برنامه به طور فعال از آنها استفاده نمیکند، باید آنها را آزاد کند.
در اینجا به صورت خلاصه توضیح میدهیم که چگونه میتوانید از نشت حافظه (memory leak) در اندروید جلوگیری کنید:
1. استفاده از ابزارهای Debugging:
برای پیدا کردن مشکلات مربوط به نشت حافظه، میتوانید از ابزارهای Debugging مانند Android Profiler و Leak Canary استفاده کنید. این ابزار به شما اجازه میدهد تا مصرف حافظه برنامهی خود را اندازهگیری کنید و مشخص کنید که کدام قسمتها از حافظه بیشترین استفاده را میکنند. با استفاده از این ابزار میتوانید خطاهای مربوط به نشت حافظه را پیدا کنید و آنها را برطرف کنید.
Leak Canary
یک کتابخانه متن باز برای جلوگیری از نشت حافظه (memory leak) در برنامههای اندرویدی است. این کتابخانه به صورت خودکار بررسی میکند که آیا هر یک از اشیاءی که در حافظه برنامه ذخیره شدهاند، به درستی آزاد شدهاند یا خیر.
با استفاده از Leak Canary، میتوانید در طول زمان اشیاءی را که در حافظه برنامه باقی ماندهاند، پیدا کرده و آنها را برطرف کنید. این کتابخانه با استفاده از تکنیکهایی مانند Reference Counting و WeakReference به نشان دادن اشیاء باقیمانده کمک میکند.
استفاده از Leak Canary بسیار ساده است. بعد از اضافه کردن کتابخانه به پروژه اندرویدی خود، کافیست که یک instance از کلاس `LeakCanary` ایجاد کنید و آن را به عنوان یک Initializer در برنامهی خود تنظیم کنید. این کتابخانه بعد از شناسایی نشت حافظه، یک گزارش به شما ارائه میدهد که شامل جزئیاتی از اشیاء باقیمانده و محل آنها در کد برنامه است.
استفاده از Leak Canary در فرآیند توسعه برنامه بسیار مفید است زیرا به شما کمک میکند که خطاهای نشت حافظه را به سرعت پیدا کنید و اصلاح کنید. همچنین، این کتابخانه به شما امکان میدهد که در زمان اجرا از نشت حافظه جلوگیری کنید و در نتیجه، کارایی و عملکرد برنامه را بهبود بخشید.
2. جمع آوری زباله (Garbage Collection):
برای جلوگیری از نشت حافظه (memory leak)، باید مطمئن شوید که زبالههایی که تولید میشوند، به طور مرتب جمع آوری شوند. در اندروید، جمع آوری زباله به صورت خودکار انجام میشود، اما میتوانید از متدهای finalize() یا onDestroy() برای جمع آوری زبالههایی که به صورت خودکار جمع آوری نمیشوند، استفاده کنید.
3. استفاده از WeakReference:
استفاده از WeakReference برای ذخیره اشیاء غیرضروری مفید است. در این روش، اشیاء غیرضروری با استفاده از یک WeakReference ذخیره میشوند و اگر این اشیاء دیگر به صورت مستقیم به کار نرفتهاند، از حافظه حذف میشوند. این روش مانع از این میشود که اشیاء غیرضروری باعث نشت حافظه شوند.
4. آزمونهای تابعی:
برای جلوگیری از نشت حافظه (memory leak)، باید از آزمونهای تابعی استفاده کنید تا اطمینان حاصل کنید که تمامی متغیرها به درستی آزاد شدهاند. برای مثال، میتوانید از متد onDestroy() برای آزاد کردن منابعی که در طول عمر یک Activity استفاده شدهاند، استفاده کنید.
5. توسعهی پایدار:
توسعهی پایدار و بهروزرسانی منظم برنامهی شما میتواند به کاهش نشت حافظه (memory leak) کمک کند. در هر بهروزرسانی، مشکلات موجود را برطرف کنید و به تناسب با تغییراتی که در اندروید اتفاق میافتد، برنامهی خود رابه روز کنید. همچنین، باید از بهترین شیوههای برنامهنویسی و طراحی استفاده کنید تا از نشت حافظه جلوگیری کنید.
6. استفاده از حافظه بهینه:
استفاده از حافظهی بهینه میتواند به کاهش نشت حافظه (memory leak) کمک کند. برای مثال، میتوانید از Bitmap به جای Drawable برای تصاویر استفاده کنید، زیرا Drawable به صورت ضمنی یک رابط Bitmap را نگه میدارد و ممکن است باعث نشت حافظه شود. همچنین، باید استفاده از static و final را به حداقل برسانید زیرا این متغیرها به صورت پایدار در حافظه نگه داشته میشوند و ممکن است باعث نشت حافظه شوند.
7. استفاده از اشیاء قابل استفاده مجدد:
برای کاهش مصرف حافظه، میتوانید از اشیاء قابل استفاده مجدد مانند ViewHolder در ListView و RecyclerView استفاده کنید. با استفاده از این اشیاء، میتوانید تعداد اشیاء جدیدی که برای نمایش در UI ایجاد میشوند را کاهش دهید و در نتیجه مصرف حافظه را کاهش دهید.
8. استفاده از طراحی مناسب UI:
طراحی مناسب UI میتواند به کاهش نشت حافظه (memory leak) کمک کند. برای مثال، میتوانید از تصاویر کم حجم استفاده کنید، انیمیشنهای پیچیده را کاهش دهید و از تعداد کمتری لایه برای UI استفاده کنید.
9. استفاده از متدهای استفادهی درست:
برای جلوگیری از نشت حافظه (memory leak)، باید از متدهای استفادهی درست استفاده کنید. برای مثال، باید از متدهای onCreate() و onDestroy() درست استفاده کنید و مطمئن شوید که تمامی منابعی که در طول عمر یک Activity استفاده شدهاند، در زمان مناسب آزاد شدهاند.
در نهایت، برای جلوگیری از نشت حافظه (memory leak) در اندروید، باید به صورت مداوم برنامهی خود را به روز رسانی کنید.
و همچنین ممنون میشم از طریق ستارههای این پایین به این مقاله امتیاز بدی و اگه هر سوالی داشتی توی قسمت دیدگاه بپرس و قطعا بهت پاسخ میدیم.
مطالب زیر را حتما مطالعه کنید
چگونه دوره آموزشی کاتلین پیشرفته میتواند مهارتهای شما را ارتقاء دهد؟
مزیتهای کاتلین نسبت به سایر زبانهای برنامه نویسی اندروید
بهینهسازی عملکرد اپلیکیشنهای اندروید: راهنمای جامع و کاربردی
سوالات مصاحبهی استخدامی کاتلین همراه با جواب(قسمت چهارم)
سوالات مصاحبه استخدام زبان کاتلین همراه با جواب(قسمت سوم)
سوالات مصاحبه استخدام کاتلین همراه با جواب(قسمت دوم)
1 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
عالی بود تشکر