چگونه memory Leak را در برنامه اندروید خود برطرف کنیم؟
یکی از نکات جالب در مورد جاوا جمع آوری زباله (GC) است. جمع کننده زباله به صورت دوره ای برای بررسی object هایی که استفاده نمی شوند اجرا می شود و آنها را از بین می برد.
یک حافظه چه زمانی Memory Leak می کند؟
نشت حافظه زمانی رخ می دهد که object وجود داشته باشد اما برنامه از آنها استفاده نمی کند و جمع کننده زباله قادر به تشخیص آن نیست . از این رو ، آنها در حافظه بدون استفاده باقی می مانند و میزان حافظه موجود برای برنامه را کاهش می دهند ، که در این صورت نتایج غیر منتظره ای رخ خواهد داد.
چگونه Memory Leak حافظه را تشخیص دهیم؟
روش های مختلفی برای انجام این کار وجود دارد. ما قصد داریم در این مقاله به برخی از آنها بپردازیم.
در ابتدا کدی می نویسیم که باعث ایجاد نشت حافظه شود. ما یک برنامه با دو Activity ایجاد خواهیم کرد. Activity A دارای یک button است که Activity B را باز می کند. علاوه بر این ، ما همچنین یک کلاس singleton به نام Managerایجاد می کنیم که دارای یک static refrenceاز یک Context باشد.
class Manager {
private static Manager ourInstance;
private Context context;
static Manager getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new Manager(context);
}
return ourInstance;
}
private Manager(Context context) {
this.context = context;
}
}
سپس این کلاس singleton را ازActivity A صدا میزنیم.
Manager.getInstance(this);
تشخیص Memory Leak حافظه با استفاده از مانیتورهای Android Studio
اندروید استودیو ابزارهای مفیدی برای نمایه سازی عملکرد برنامه شما فراهم می کند و یکی از آنها Memory Monitor است. ما می توانیم ازMemory Monitor برای شناسایی نشت حافظه از طریق مراحل زیر استفاده کنیم:
- برنامه خود را روی موبایل یا شبیه ساز خود اجرا کنید.
- Android Monitor را باز کنید (Cmd + 6 را در Mac یا Alt + 6 را در ویندوز فشار دهید). در بالای Memory Monitor ، روی Start Allocation Tracking کلیک کنید.
- از برنامه در اطراف بخشی که احتمال می دهید نشت حافظه داشته باشد استفاده کنید. در مثال خود ، به سراغ فعالیت دیگری خواهیم رفت.
- بر روی Initiate GC کلیک کنید تا جمع کننده زباله مجبور شود شروع به جمع آوری objectهایی کند که در حال حاضر استفاده نمی شوند و آنها را خارج کنید. باید کمی نمودار حافظه کاهش یابد.
- بر روی Dump Java Heap کلیک کنید تا Android Studio یک پرونده .hprof که شامل یک heap snapshot است را ایجاد کند. ساده ترین راه برای بررسی نشت حافظه استفاده از Analyzer Tasks است
- تب Analyzer Tasks را باز کرده و سپس بر روی Run در بالای این تب کلیک کنید. شما باید Activityهای نشت کرده را در تب نتایج تجزیه و تحلیل در زیر تب Analyzer Tasks مشاهده کنید.
تشخیص Memory Leak حافظه با استفاده از Leak Canary
Leak Canary کتابخانه ای است که توسط Square ساخته شده است و راهی بسیار سریع برای تشخیص نشت حافظه است. Leak Canary به شما امکان می دهد نشت حافظه را در مدت زمان طولانی تری تشخیص دهید ، زیرا نیازی نیست دستگاه خود را به Android Studio متصل کرده و برنامه خود را برای مدت طولانی کنترل کنید. هر زمان که نشت حافظه وجود داشته باشد ، Leak Canary اعلان هایی برای شما ارسال می کند.
اضافه کردن Leak Canary واقعاً آسان است. تمام کاری که شما باید انجام دهید این است که موارد زیر را به فایل build.gradle سطح برنامه خود اضافه کنید:
dependencies;{
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'
}
سپس کد زیر را به کلاس Application خود اضافه کنید:
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code…
}
تشخیص Memory Leak های احتمالی با infer
Infer یک ابزار تجزیه و تحلیل static است که توسط facebook ساخته شده است و به شما کمک می کند تا استثناهای null pointer و نشت منابع و همچنین قابلیت دسترسی به annotation ، قفل محافظ از دست رفته و شرایط گردش همزمانی را پیدا کنید. این ابزار خوبی برای افزودن به CI شما است تا از همه اشکالات احتمالی عبور کنید. این ابزارهمچنین open source است ، بنابراین توسعه این ابزار هنوز در حال تکامل است.
دیدگاهتان را بنویسید