تجزیه و تحلیل و مدیریت حافظه در اندروید - بخش دوم

تجزیه و تحلیل و مدیریت حافظه در اندروید - بخش دوم

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

ابزارهای پروفایلینگ اندروید

ابزار پروفایلینگ اندروید به شما در جهت مدیریت حافظه در گوشی اندروید یاری می رساند، SDK اندروید دو راه برای پروفایلینگ حافظه اندروید در اختیار قرار می دهد:

- استفاده از Allocation Tracker

- استفاده از Heap Dump

استفاده از Allocation Tracker:

Allocation Tracker هر تخصیص حافظه که اپلیکیشن در طول چرخه پروفایلینگ به اجرا در می آورد را ثبت می کند و برای کسب اطلاع از نوع تخصیص های صورت گرفته کاربردی می باشد. اما این ابزار اطلاعاتی از هیپ اپلیکیشن در اختیار شما قرار نمی دهد.

Allocation Tracker حافظه تخصیص یافته برای فرآیند انتخاب شده را به نمایش می گذارد و آبجکت های خاصی را که همراه ترد در حال تخصیص اند به همراه متد و خط کد آن نمایش می دهد.

DDMS امکانی برای ردیابی آبجکت های در حال تخصیص به حافظه در اختیار قرار می دهد و کلاس ها و تردهایی را که به  آبجکت ها تخصیص داده شده اند نمایش می دهد. این ابزار به شما امکان ردیابی جاهایی که آبجکت ها در ریل تایم تخصیص داده شده اند می دهد یعنیزمانی که یک عملیات خاص را در اپلیکیشن خود به اجرا در می آورید. این داده برای اندازه گیری میزان استفاده از حافظه که کارآیی اپلیکیشن را تحت تاثیر قرار می دهد، ارزشمند است.

برای راه اندازی Allocation Tracker در DDMS اندروید گام های زیر را دنبال کنید:

- اپلیکیشن خود را بر روی گوشی و یا امولاتور نصب کرده و بر روی دکمه اندروید در بخش زیرین اندروید استودیو کلیک نمایید.

- ردیابی تخصیص ها را استارت کنید.

- کمی با اپلیکیشن کار کنید.

- ردیاب را متوقف کنید.

به شکل زیر مراجعه نمایید.

blog_15567_1

پس از چند ثانیه پنجره ای با داده های ثبت شده شما باز می شود.

blog_15567_2

Heap Dumps

یک heap dump یک تصویر فوری از هیپ اپلیکیشن می باشد که به صورت باینری دخیره شده و HPROF نام گرفته است. ماشین مجازی Dalvik قادر به تولید یک dump کامل از محتویات هیپ مجازی می باشد. این عملکرد در دیباگ کردن میزان استفاده از حافظه بسیار کاربردی است و به دنبال نشتی های حافظه می گردد.

برای چک کردن تخصیص حافظه با استفاده از هیپ گام هایی زیر را دنبال کنید:

به منظور چک کردن هیپ اپلیکیشن و تخصیص حافظه در اندروید استودیو، اول از همه باید MAT را نصب کنید، می توانید از طریق این لینک آن را دانلود نمایید. Eclipse Memory Analyser Tooling یا همان MAT مجموعه ای از پلاگین ها برای Eclipse است که ابزارهایی برای تجزیه و تحلیل heap dumps از اپلیکیشن جاوا را در اختیار قرار می دهد و برای تشخیص مشکلات مرتبط با حافظه در اپلیکیشن کاربرد دارد. بدین ترتیب توسعه دهنده قادر به یافتن نشتی های حافظه و مسائل مربوط به مصرف بالای حافظه می باشد.

پس از نصب MAT گام های زیر را دنبالکنید.

1. در اندروید استودیو به قسمت Tools -> Android -> Android Device Monitor بروید.

2. در قسمت بالا سمت چپ در قسمت زیر Devices فرآیند یا پکیج پروژه را انتخاب کرده و گزینه آپدیت را در قسمت بالای فرآیندها برگزینید.

blog_15567_3

3. در پنل سمت راست تب Heap را انتخاب کنید.

blog_15567_4

4. بر روی آیکون Cause G کلیک کنید تا نتایج تخصیص حافظه نمایش داده شود.

blog_15567_5

بر روی آیکون Cause G کلیک کنید تا نتایج تخصیص حافظه نمایش داده شود.

5. بر روی Dump HPROF در بالای فهرست فرآیندها کلیک کرده و آن را ذخیره کنید. در زیر این فایل در پوشه ویدئوها ذخیره شده است.

6. سپس Command prompt را به اجرا در آورده و به پوشه Android-SDK اشاره کنید.

7. مکان قرارگیری hprof-conv  را بیابید، مثلا تصور کنید که این فایل در دایرکتوری C قرار گرفته است، با ارجاع به این پوشه و تبدیل فرمت این فایل به منظور خواندن آن در MAT دستور را به اجرا در آورید.

Microsoft Windows [Version 6.3.9600]

(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\admin>cd C:\Users\Tools\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools

C:\Users\Tools\adt-bundle-windows-x86_64-20140702\adt-bundle-windows-x86_64-20140702\sdk\platform-tools>hprof-conv "C:\Users\admin\Videos\memoryleak.acadgild.com.myapplication.hprof" "C:\Users\admin\Videos\leakage.hprof”

هم اکنون فایل به leakage.hprof تبدیل می شود، این فایل را چک و آن را در MAT باز کنید، نحوه انجام کار در تصویر زیر نمایش داده شده است:

blog_15567_6

یک مثال ریل تایم از نشتی حافظه

مثال زیر نحوه پیدا کردن نشتی های حافظه که قادر به اصلاح آنها می باشید را به نمایش گذاشته است. گام هایی زیر یه منظور انجام این کار لازم اند:

1. ساخت پروژه اندروید استودیو و تغییر MainActivity.java.

package com.acadgild.memoryleak;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity{

static MemoryLeakyCheck checkLeak=null;

class MemoryLeakyCheck{

}

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if(checkLeak==null){

checkLeak=new MemoryLeakyCheck();

}

}

}

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

blog_15567_7

3. برای چک کردن تخصیص حافظه با استفاده از Heap گام ها را به دقت دنبال کنید. چنانچه به درستی مراحل را به اجرا در آورید قادر به یافتن نتایجی مشابه اسکرین شات زیر خواهید بود:

blog_15567_8

4. با انتخاب Leak Suspects Report بر روی Finish کلیک کنید. شما باید قادر به مشاهده جزئیاتی از نشتی مشکوک و توضیح مشکل به صورت زیر باشید:

مشکل 1

blog_15567_10

مشکل 2

blog_15567_11

مشکل 3

blog_15567_12

5. یک Histogram از مجموعه آبجکت های دلخواه بسازید.

blog_15567_13

6. بر روی نوار عنوان Shallow Heap جهت مرتب سازی داده ها به صورت صعودی کلیک کنید.

blog_15567_14

7. بر روی byte[] -> List Objects -> with incoming references کلیک راست کنید.

blog_15567_15

با این کار باید چیزی مشابه زیر مشاهده کنید.

blog_15567_16

8. Object Query Language Studio را به منظور اجرای دستورات باز کنید.

blog_15567_17

دستور زیر را به منظور یافتن نشتی ها اجرا کنید:

blog_15567_18

با کلیک بر روی F5 و اجرای کوئری نتایج مشابه تصویر زیر دریافت خواهید کرد.

blog_15567_19

9. بر روی نتایج کلیک راست کرده و به قسمت GC Roots -> Exclude weak references مراجعه کنید.

blog_15567_20

10. آبجکت های Memory Leak را پیدا کرده و آنها را با استفاده از کد تصحیح کنید.

blog_15567_21

11. هم اکنون شما می دانید که نشتی حافظه در اثر استفاده از متغیر ثابت checkLeak بوجود آمده، بنابراین لازم است عبارت کلیدی ثابت را از این متغیر حذف کنید.

کد شما باید مشابه زیر باشد:

package com.acadgild.memoryleak;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity{

MemoryLeakyCheck checkLeak=null;

class MemoryLeakyCheck{

}

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

if(checkLeak==null){

checkLeak=new MemoryLeakyCheck();

}

}

}

در این مطلب مدیریت حافظه در اندروید و مدیریت حافظه داخلی اپلیکیشن اندروید شرح داده شد.

 

https://acadgild.com برگرفته از

اینها را هم بخوانید