نمونه هایی از اندازه گیری و تحلیل عملکرد، نمونه هایی از اندازه گیری و تحلیل عملکرد، نمونه هایی از اندازه گیری و تحلیل عملکرد، نمونه هایی از اندازه گیری و تحلیل عملکرد

این مثال‌ها نحوه استفاده از ردیابی سیستم با Macrobenchmark را به همراه پروفایل حافظه برای اندازه‌گیری و بهبود انواع خاصی از مشکلات عملکرد نشان می‌دهند.

اشکال زدایی راه اندازی برنامه با استفاده از systrace

هنگام اشکال‌زدایی زمان راه‌اندازی، توصیه می‌کنیم از گزارش‌های systrace استفاده کنید. Systrace سیستمی است که از کدهای از پیش ابزار دقیق برای خروجی گرفتن مدت زمانی که رویدادهای خاص در زمان وقوع آنها طول می کشد استفاده می کند. این ردیابی‌ها به شما امکان می‌دهند آنچه را که در برنامه شما یا حتی در فرآیندهای دیگر در سراسر سیستم اتفاق می‌افتد، مشاهده کنید. پلتفرم Android و کتابخانه‌های Jetpack دارای ابزار دقیقی در مورد بسیاری از رویدادهای کلیدی در یک برنامه هستند، و این موارد مطابق با آن ثبت می‌شوند. همچنین می‌توانید برنامه‌های خود را با ردیابی‌های سفارشی خود، که در همان ابزارهای تجسم systrace نشان داده می‌شوند، تنظیم کنید تا تصویری کلی از آنچه در برنامه اتفاق افتاده است ارائه دهید.

با استفاده از systrace یا Perfetto

برای کسب اطلاعات بیشتر در مورد استفاده اولیه از systrace، ویدیوی زیر را ببینید: اشکال زدایی عملکرد برنامه .

برای تجزیه و تحلیل زمان راه اندازی، ابتدا باید بفهمید که در طول راه اندازی چه اتفاقی می افتد. اگر اطلاعات بیشتری نسبت به آنچه در این صفحه توضیح داده شده می‌خواهید، مستندات مربوط به زمان راه‌اندازی برنامه یک نمای کلی از روند راه‌اندازی برنامه ارائه می‌دهد.

مراحل راه اندازی اپلیکیشن عبارتند از:

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

انواع استارت آپ دارای مراحل زیر هستند:

  • شروع سرد: این زمانی اتفاق می‌افتد که برنامه برای اولین بار از زمان راه‌اندازی یا از زمانی که فرآیند برنامه از بین رفته است، چه توسط کاربر یا توسط سیستم، شروع شود. راه اندازی یک فرآیند جدید بدون حالت ذخیره شده ایجاد می کند.
  • شروع گرم: این زمانی اتفاق می‌افتد که برنامه از قبل در پس‌زمینه اجرا می‌شود، اما فعالیت باید دوباره ایجاد شود و در پیش‌زمینه قرار گیرد. اکتیویتی یا در حین استفاده مجدد از فرآیند موجود دوباره ایجاد می شود، یا فرآیند با حالت ذخیره شده دوباره ایجاد می شود. کتابخانه تست Macrobenchmark با استفاده از اولین گزینه از تست راه اندازی گرم سازگار پشتیبانی می کند.
  • شروع داغ: این زمانی اتفاق می‌افتد که فرآیند و فعالیت هنوز در حال اجرا هستند و صرفاً باید به پیش‌زمینه آورده شوند، احتمالاً برخی از اشیاء در صورت لزوم بازسازی شوند، و همچنین فعالیت پیش‌زمینه جدید ارائه شود. این کوتاه ترین سناریوی راه اندازی است.

توصیه می‌کنیم systraces را با استفاده از برنامه ردیابی سیستم موجود در Developer Options در دستگاه ضبط کنید. اگر می‌خواهید از ابزارهای خط فرمان استفاده کنید، Perfetto برای استفاده با Android 10 (سطح API 29) و بالاتر در دسترس است، در حالی که دستگاه‌های نسخه‌های قبلی باید از systrace استفاده کنند.

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

در صورت امکان، توصیه می‌کنیم از منظر برنامه، پس از اتمام راه‌اندازی، یک تماس reportFullyDrawn (موجود در Android 10 و بالاتر) وارد کنید.

برخی از مواردی که باید در این ردیابی سیستم جستجو کنید عبارتند از:

Monitor contention
شکل 1. رقابت برای منابع محافظت شده توسط مانیتور می تواند تاخیر قابل توجهی در راه اندازی برنامه ایجاد کند.

معاملات صحافی همزمان
شکل 2. به دنبال تراکنش های غیر ضروری در مسیر بحرانی برنامه خود باشید.

جمع آوری همزمان زباله
شکل 3. جمع‌آوری همزمان زباله رایج است و تأثیر نسبتاً کمی دارد، اما اگر به آن ضربه می‌زنید اغلب آن را با نمایه‌ساز حافظه Android Studio بررسی کنید.

I/O هنگام راه اندازی
شکل 4. ورودی/خروجی را در حین راه اندازی بررسی کنید و به دنبال غرفه های طولانی باشید.

در شکل 4، توجه داشته باشید که سایر فرآیندهایی که همزمان I/O را انجام می دهند، می توانند باعث ایجاد مشاجره I/O شوند، بنابراین مطمئن شوید که سایر فرآیندها در حال اجرا نیستند.

فعالیت قابل توجه در رشته‌های دیگر می‌تواند با رشته رابط کاربری تداخل داشته باشد، بنابراین در هنگام راه‌اندازی مراقب کار پس‌زمینه باشید. توجه داشته باشید که دستگاه‌ها می‌توانند پیکربندی‌های CPU مختلفی داشته باشند، بنابراین تعداد رشته‌هایی که می‌توانند به صورت موازی اجرا شوند می‌تواند در دستگاه‌ها متفاوت باشد.

همچنین راهنمای منابع رایج jank را بررسی کنید

از نمایه کننده حافظه اندروید استودیو استفاده کنید

نمایه‌ساز حافظه اندروید استودیو ابزاری قدرتمند برای کاهش فشار حافظه است که می‌تواند ناشی از نشت حافظه یا الگوهای بد استفاده باشد. این یک نمای زنده از تخصیص و مجموعه اشیاء را ارائه می دهد.

برای رفع مشکلات حافظه در برنامه‌تان، می‌توانید از نمایه‌گر حافظه برای ردیابی چرایی و تعداد دفعات جمع‌آوری زباله‌ها، و همچنین وجود نشت حافظه احتمالی که باعث می‌شود هیپ شما در طول زمان دائماً افزایش یابد، استفاده کنید.

نمایه سازی حافظه برنامه به مراحل زیر تقسیم می شود:

1. مشکلات حافظه را تشخیص دهید

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

افزایش تعداد اشیا
شکل 5. نمایه ساز حافظه افزایش تخصیص اشیا را در طول زمان نشان می دهد.

جمع آوری زباله
شکل 6. نمایه ساز حافظه که رویدادهای جمع آوری زباله را نشان می دهد.{.:image-caption}

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

2. نقاط داغ فشار حافظه را تشخیص دهید

محدوده ای را در جدول زمانی انتخاب کنید تا هم تخصیص ها و هم اندازه کم عمق را تجسم کنید.

تخصیص و اندازه کم عمق را تجسم کنید
شکل 7. نمایه ساز حافظه که تخصیص ها و اندازه ها را برای یک محدوده انتخاب شده در جدول زمانی نشان می دهد.

روش های مختلفی برای مرتب سازی این داده ها وجود دارد. بخش‌های زیر نمونه‌هایی از این که چگونه هر نما می‌تواند به شما در تجزیه و تحلیل مسائل کمک کند، ارائه می‌کند.

بر اساس کلاس ترتیب دهید

مرتب سازی بر اساس کلاس زمانی مفید است که می خواهید کلاس هایی را بیابید که در حال تولید اشیایی هستند که در غیر این صورت باید در حافظه پنهان ذخیره شوند یا دوباره از یک مخزن حافظه استفاده شوند.

برای مثال، تصور کنید اپلیکیشنی را می‌بینید که در هر ثانیه 2000 شی با کلاس به نام Vertex ایجاد می‌کند. این امر تعداد تخصیص ها را در هر ثانیه 2000 افزایش می دهد و هنگام مرتب سازی بر اساس کلاس آن را مشاهده می کنید. آیا برای جلوگیری از تولید آن زباله باید از چنین اشیایی دوباره استفاده کرد؟ اگر پاسخ مثبت است، احتمالاً به پیاده‌سازی یک مخزن حافظه نیاز خواهد بود.

ترتیب با پشته تماس

مرتب سازی توسط callstack زمانی مفید است که یک مسیر داغ وجود دارد که حافظه در آن تخصیص داده می شود، مانند داخل یک حلقه یا یک تابع خاص که کارهای تخصیص زیادی را انجام می دهد. مشاهده توسط callstack به شما امکان می دهد آن نقاط تخصیص را ببینید.

کم عمق در مقابل اندازه حفظ شده

اندازه کم عمق فقط حافظه خود شی را ردیابی می کند، بنابراین برای ردیابی کلاس های ساده که عمدتاً از موارد اولیه تشکیل شده اند بسیار مفید است.

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

تخلیه کامل حافظه
شکل 8. شما می توانید در هر زمان که بخواهید با کلیک بر روی دکمه Dump Java heap در نوار ابزار نمایه کننده حافظه، یک حافظه خالی ایجاد کنید.

به عنوان ستون اضافه شد
شکل 9. ایجاد یک حافظه خالی ستونی را نشان می دهد که تخصیص اشیا را در آن پشته نشان می دهد.

3. اندازه گیری تاثیر یک بهینه سازی

یکی از بهبودهای بهینه سازی حافظه که اندازه گیری آن آسان است، جمع آوری زباله است. هنگامی که یک بهینه سازی فشار حافظه را کاهش می دهد، باید مجموعه های زباله (GC) کمتری را مشاهده کنید. برای اندازه گیری این، زمان بین GC ها را در جدول زمانی پروفایلر اندازه گیری کنید. پس از بهینه سازی حافظه، باید مدت زمان بیشتری را بین GCها مشاهده کنید.

تأثیر نهایی بهبودهای حافظه مانند موارد زیر است:

  • اگر برنامه دائماً فشار حافظه نداشته باشد، برنامه کمتر به دلیل مشکلات حافظه از بین می رود.
  • داشتن GC کمتر، معیارهای jank را بهبود می بخشد. این به این دلیل است که GC ها باعث ایجاد اختلاف در CPU می شوند که می تواند منجر به به تعویق افتادن وظایف رندر در حین انجام GC شود.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% endverbatim %}،

این مثال‌ها نحوه استفاده از ردیابی سیستم با Macrobenchmark را به همراه پروفایل حافظه برای اندازه‌گیری و بهبود انواع خاصی از مشکلات عملکرد نشان می‌دهند.

اشکال زدایی راه اندازی برنامه با استفاده از systrace

هنگام اشکال‌زدایی زمان راه‌اندازی، توصیه می‌کنیم از گزارش‌های systrace استفاده کنید. Systrace سیستمی است که از کدهای از پیش ابزار دقیق برای خروجی گرفتن مدت زمانی که رویدادهای خاص در زمان وقوع آنها طول می کشد استفاده می کند. این ردیابی‌ها به شما امکان می‌دهند آنچه را که در برنامه شما یا حتی در فرآیندهای دیگر در سراسر سیستم اتفاق می‌افتد، مشاهده کنید. پلتفرم Android و کتابخانه‌های Jetpack دارای ابزار دقیقی در مورد بسیاری از رویدادهای کلیدی در یک برنامه هستند، و این موارد مطابق با آن ثبت می‌شوند. همچنین می‌توانید برنامه‌های خود را با ردیابی‌های سفارشی خود، که در همان ابزارهای تجسم systrace نشان داده می‌شوند، تنظیم کنید تا تصویری کلی از آنچه در برنامه اتفاق افتاده است ارائه دهید.

با استفاده از systrace یا Perfetto

برای کسب اطلاعات بیشتر در مورد استفاده اولیه از systrace، ویدیوی زیر را ببینید: اشکال زدایی عملکرد برنامه .

برای تجزیه و تحلیل زمان راه اندازی، ابتدا باید بفهمید که در طول راه اندازی چه اتفاقی می افتد. اگر اطلاعات بیشتری نسبت به آنچه در این صفحه توضیح داده شده می‌خواهید، مستندات مربوط به زمان راه‌اندازی برنامه یک نمای کلی از روند راه‌اندازی برنامه ارائه می‌دهد.

مراحل راه اندازی اپلیکیشن عبارتند از:

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

انواع استارت آپ دارای مراحل زیر هستند:

  • شروع سرد: این زمانی اتفاق می‌افتد که برنامه برای اولین بار از زمان راه‌اندازی یا از زمانی که فرآیند برنامه از بین رفته است، چه توسط کاربر یا توسط سیستم، شروع شود. راه اندازی یک فرآیند جدید بدون حالت ذخیره شده ایجاد می کند.
  • شروع گرم: این زمانی اتفاق می‌افتد که برنامه قبلاً در پس‌زمینه اجرا می‌شود، اما فعالیت باید دوباره ایجاد شود و در پیش‌زمینه قرار گیرد. اکتیویتی یا در حین استفاده مجدد از فرآیند موجود دوباره ایجاد می شود، یا فرآیند با حالت ذخیره شده دوباره ایجاد می شود. کتابخانه تست Macrobenchmark با استفاده از اولین گزینه از تست راه اندازی گرم سازگار پشتیبانی می کند.
  • شروع داغ: این زمانی اتفاق می‌افتد که فرآیند و فعالیت هنوز در حال اجرا هستند و صرفاً باید به پیش‌زمینه آورده شوند، احتمالاً برخی از اشیاء در صورت لزوم بازسازی شوند، و همچنین فعالیت پیش‌زمینه جدید ارائه شود. این کوتاه ترین سناریوی راه اندازی است.

توصیه می‌کنیم systraces را با استفاده از برنامه ردیابی سیستم موجود در Developer Options در دستگاه ضبط کنید. اگر می‌خواهید از ابزارهای خط فرمان استفاده کنید، Perfetto برای استفاده با Android 10 (سطح API 29) و بالاتر در دسترس است، در حالی که دستگاه‌های نسخه‌های قبلی باید از systrace استفاده کنند.

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

در صورت امکان، توصیه می‌کنیم یک تماس reportFullyDrawn (موجود در Android 10 و بالاتر) را هنگام اتمام راه‌اندازی از منظر برنامه اضافه کنید.

برخی از مواردی که باید در این ردیابی سیستم جستجو کنید عبارتند از:

Monitor contention
شکل 1. رقابت برای منابع محافظت شده توسط مانیتور می تواند تاخیر قابل توجهی در راه اندازی برنامه ایجاد کند.

معاملات صحافی همزمان
شکل 2. به دنبال تراکنش های غیر ضروری در مسیر بحرانی برنامه خود باشید.

جمع آوری همزمان زباله
شکل 3. جمع‌آوری همزمان زباله رایج است و تأثیر نسبتاً کمی دارد، اما اگر به آن ضربه می‌زنید اغلب آن را با نمایه‌ساز حافظه Android Studio بررسی کنید.

I/O هنگام راه اندازی
شکل 4. ورودی/خروجی را در حین راه اندازی بررسی کنید و به دنبال غرفه های طولانی باشید.

در شکل 4، توجه داشته باشید که سایر فرآیندهایی که همزمان I/O را انجام می‌دهند، می‌توانند باعث مشاجره I/O شوند، بنابراین مطمئن شوید که سایر فرآیندها اجرا نمی‌شوند.

فعالیت قابل توجه در رشته‌های دیگر می‌تواند با رشته رابط کاربری تداخل داشته باشد، بنابراین در هنگام راه‌اندازی مراقب کار پس‌زمینه باشید. توجه داشته باشید که دستگاه‌ها می‌توانند پیکربندی‌های CPU مختلفی داشته باشند، بنابراین تعداد رشته‌هایی که می‌توانند به صورت موازی اجرا شوند می‌تواند در دستگاه‌ها متفاوت باشد.

همچنین راهنمای منابع رایج jank را بررسی کنید

از نمایه کننده حافظه اندروید استودیو استفاده کنید

نمایه‌ساز حافظه اندروید استودیو ابزاری قدرتمند برای کاهش فشار حافظه است که می‌تواند ناشی از نشت حافظه یا الگوهای بد استفاده باشد. این یک نمای زنده از تخصیص و مجموعه اشیاء را ارائه می دهد.

برای رفع مشکلات حافظه در برنامه‌تان، می‌توانید از نمایه‌گر حافظه برای ردیابی چرایی و تعداد دفعات جمع‌آوری زباله‌ها، و همچنین وجود نشت حافظه احتمالی که باعث می‌شود هیپ شما در طول زمان دائماً افزایش یابد، استفاده کنید.

نمایه سازی حافظه برنامه به مراحل زیر تقسیم می شود:

1. مشکلات حافظه را تشخیص دهید

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

افزایش تعداد اشیا
شکل 5. نمایه ساز حافظه افزایش تخصیص اشیا را در طول زمان نشان می دهد.

جمع آوری زباله
شکل 6. نمایه ساز حافظه که رویدادهای جمع آوری زباله را نشان می دهد.{.:image-caption}

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

2. نقاط داغ فشار حافظه را تشخیص دهید

محدوده ای را در جدول زمانی انتخاب کنید تا هم تخصیص ها و هم اندازه کم عمق را تجسم کنید.

تخصیص و اندازه کم عمق را تجسم کنید
شکل 7. نمایه ساز حافظه که تخصیص ها و اندازه ها را برای یک محدوده انتخاب شده در جدول زمانی نشان می دهد.

روش های مختلفی برای مرتب سازی این داده ها وجود دارد. بخش‌های زیر نمونه‌هایی از این که چگونه هر نما می‌تواند به شما در تجزیه و تحلیل مسائل کمک کند، ارائه می‌کند.

بر اساس کلاس ترتیب دهید

مرتب سازی بر اساس کلاس زمانی مفید است که می خواهید کلاس هایی را بیابید که در حال تولید اشیایی هستند که در غیر این صورت باید در حافظه پنهان ذخیره شوند یا دوباره از یک مخزن حافظه استفاده شوند.

برای مثال، تصور کنید اپلیکیشنی را می‌بینید که در هر ثانیه 2000 شی با کلاس به نام Vertex ایجاد می‌کند. این امر تعداد تخصیص ها را در هر ثانیه 2000 افزایش می دهد و هنگام مرتب سازی بر اساس کلاس آن را مشاهده می کنید. آیا برای جلوگیری از تولید آن زباله باید از چنین اشیایی دوباره استفاده کرد؟ اگر پاسخ مثبت است، احتمالاً به پیاده‌سازی یک مخزن حافظه نیاز خواهد بود.

ترتیب با پشته تماس

مرتب سازی توسط callstack زمانی مفید است که یک مسیر داغ وجود دارد که حافظه در آن تخصیص داده می شود، مانند داخل یک حلقه یا یک تابع خاص که کارهای تخصیص زیادی را انجام می دهد. مشاهده توسط callstack به شما امکان می دهد آن نقاط تخصیص را ببینید.

کم عمق در مقابل اندازه حفظ شده

اندازه کم عمق فقط حافظه خود شی را ردیابی می کند، بنابراین برای ردیابی کلاس های ساده که عمدتاً از موارد اولیه تشکیل شده اند بسیار مفید است.

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

تخلیه کامل حافظه
شکل 8. شما می توانید در هر زمان که بخواهید با کلیک بر روی دکمه Dump Java heap در نوار ابزار نمایه کننده حافظه، یک حافظه خالی ایجاد کنید.

به عنوان ستون اضافه شد
شکل 9. ایجاد یک حافظه خالی ستونی را نشان می دهد که تخصیص اشیا را در آن پشته نشان می دهد.

3. اندازه گیری تاثیر یک بهینه سازی

یکی از بهبودهای بهینه سازی حافظه که اندازه گیری آن آسان است، جمع آوری زباله است. هنگامی که یک بهینه سازی فشار حافظه را کاهش می دهد، باید مجموعه های زباله (GC) کمتری را مشاهده کنید. برای اندازه گیری این، زمان بین GC ها را در جدول زمانی پروفایلر اندازه گیری کنید. پس از بهینه سازی حافظه، باید مدت زمان بیشتری را بین GCها مشاهده کنید.

تأثیر نهایی بهبودهای حافظه مانند موارد زیر است:

  • اگر برنامه دائماً فشار حافظه نداشته باشد، برنامه کمتر به دلیل مشکلات حافظه از بین می رود.
  • داشتن GC کمتر، معیارهای jank را بهبود می بخشد. این به این دلیل است که GC ها باعث ایجاد اختلاف در CPU می شوند که می تواند منجر به به تعویق افتادن وظایف رندر در حین انجام GC شود.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% endverbatim %}،

این مثال‌ها نحوه استفاده از ردیابی سیستم با Macrobenchmark را به همراه پروفایل حافظه برای اندازه‌گیری و بهبود انواع خاصی از مشکلات عملکرد نشان می‌دهند.

اشکال زدایی راه اندازی برنامه با استفاده از systrace

هنگام اشکال‌زدایی زمان راه‌اندازی، توصیه می‌کنیم از گزارش‌های systrace استفاده کنید. Systrace سیستمی است که از کدهای از پیش ابزار دقیق برای خروجی گرفتن مدت زمانی که رویدادهای خاص در زمان وقوع آنها طول می کشد استفاده می کند. این ردیابی‌ها به شما امکان می‌دهند آنچه را که در برنامه شما یا حتی در فرآیندهای دیگر در سراسر سیستم اتفاق می‌افتد، مشاهده کنید. پلتفرم Android و کتابخانه‌های Jetpack دارای ابزار دقیقی در مورد بسیاری از رویدادهای کلیدی در یک برنامه هستند، و این موارد مطابق با آن ثبت می‌شوند. همچنین می‌توانید برنامه‌های خود را با ردیابی‌های سفارشی خود، که در همان ابزارهای تجسم systrace نشان داده می‌شوند، تنظیم کنید تا تصویری کلی از آنچه در برنامه اتفاق افتاده است ارائه دهید.

با استفاده از systrace یا Perfetto

برای کسب اطلاعات بیشتر در مورد استفاده اولیه از systrace، ویدیوی زیر را ببینید: اشکال زدایی عملکرد برنامه .

برای تجزیه و تحلیل زمان راه اندازی، ابتدا باید بفهمید که در طول راه اندازی چه اتفاقی می افتد. اگر اطلاعات بیشتری نسبت به آنچه در این صفحه توضیح داده شده می‌خواهید، مستندات مربوط به زمان راه‌اندازی برنامه یک نمای کلی از روند راه‌اندازی برنامه ارائه می‌دهد.

مراحل راه اندازی اپلیکیشن عبارتند از:

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

انواع استارت آپ دارای مراحل زیر هستند:

  • شروع سرد: این زمانی اتفاق می‌افتد که برنامه برای اولین بار از زمان راه‌اندازی یا از زمانی که فرآیند برنامه از بین رفته است، چه توسط کاربر یا توسط سیستم، شروع شود. راه اندازی یک فرآیند جدید بدون حالت ذخیره شده ایجاد می کند.
  • شروع گرم: این زمانی اتفاق می‌افتد که برنامه از قبل در پس‌زمینه اجرا می‌شود، اما فعالیت باید دوباره ایجاد شود و در پیش‌زمینه قرار گیرد. اکتیویتی یا در حین استفاده مجدد از فرآیند موجود دوباره ایجاد می شود، یا فرآیند با حالت ذخیره شده دوباره ایجاد می شود. کتابخانه تست Macrobenchmark با استفاده از اولین گزینه از تست راه اندازی گرم سازگار پشتیبانی می کند.
  • شروع داغ: این زمانی اتفاق می‌افتد که فرآیند و فعالیت هنوز در حال اجرا هستند و صرفاً باید به پیش‌زمینه آورده شوند، احتمالاً برخی از اشیاء در صورت لزوم بازسازی شوند، و همچنین فعالیت پیش‌زمینه جدید ارائه شود. این کوتاه ترین سناریوی راه اندازی است.

توصیه می‌کنیم systraces را با استفاده از برنامه ردیابی سیستم موجود در Developer Options در دستگاه ضبط کنید. اگر می‌خواهید از ابزارهای خط فرمان استفاده کنید، Perfetto برای استفاده با Android 10 (سطح API 29) و بالاتر در دسترس است، در حالی که دستگاه‌های نسخه‌های قبلی باید از systrace استفاده کنند.

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

در صورت امکان، توصیه می‌کنیم یک تماس reportFullyDrawn (موجود در Android 10 و بالاتر) را هنگام اتمام راه‌اندازی از منظر برنامه اضافه کنید.

برخی از مواردی که باید در این ردیابی سیستم جستجو کنید عبارتند از:

Monitor contention
شکل 1. رقابت برای منابع محافظت شده توسط مانیتور می تواند تاخیر قابل توجهی در راه اندازی برنامه ایجاد کند.

معاملات بایندر همزمان
شکل 2. به دنبال تراکنش های غیر ضروری در مسیر بحرانی برنامه خود باشید.

جمع آوری همزمان زباله
شکل 3. جمع‌آوری همزمان زباله رایج است و تأثیر نسبتاً کمی دارد، اما اگر به آن ضربه می‌زنید اغلب آن را با نمایه‌ساز حافظه Android Studio بررسی کنید.

I/O هنگام راه اندازی
شکل 4. ورودی/خروجی را در حین راه اندازی بررسی کنید و به دنبال غرفه های طولانی باشید.

در شکل 4، توجه داشته باشید که سایر فرآیندهایی که همزمان I/O را انجام می‌دهند، می‌توانند باعث مشاجره I/O شوند، بنابراین مطمئن شوید که سایر فرآیندها اجرا نمی‌شوند.

فعالیت قابل توجه در رشته‌های دیگر می‌تواند با رشته رابط کاربری تداخل داشته باشد، بنابراین در هنگام راه‌اندازی مراقب کار پس‌زمینه باشید. توجه داشته باشید که دستگاه‌ها می‌توانند پیکربندی‌های CPU مختلفی داشته باشند، بنابراین تعداد رشته‌هایی که می‌توانند به صورت موازی اجرا شوند می‌تواند در دستگاه‌ها متفاوت باشد.

همچنین راهنمای منابع رایج jank را بررسی کنید

از نمایه کننده حافظه اندروید استودیو استفاده کنید

نمایه‌ساز حافظه اندروید استودیو ابزاری قدرتمند برای کاهش فشار حافظه است که می‌تواند ناشی از نشت حافظه یا الگوهای بد استفاده باشد. این یک نمای زنده از تخصیص و مجموعه اشیاء را ارائه می دهد.

برای رفع مشکلات حافظه در برنامه‌تان، می‌توانید از نمایه‌گر حافظه برای ردیابی چرایی و تعداد دفعات جمع‌آوری زباله‌ها، و همچنین وجود نشت حافظه احتمالی که باعث می‌شود هیپ شما در طول زمان دائماً افزایش یابد، استفاده کنید.

نمایه سازی حافظه برنامه به مراحل زیر تقسیم می شود:

1. مشکلات حافظه را تشخیص دهید

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

افزایش تعداد اشیا
شکل 5. نمایه ساز حافظه افزایش تخصیص اشیا را در طول زمان نشان می دهد.

جمع آوری زباله
شکل 6. نمایه ساز حافظه که رویدادهای جمع آوری زباله را نشان می دهد.{.:image-caption}

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

2. نقاط داغ فشار حافظه را تشخیص دهید

محدوده ای را در جدول زمانی انتخاب کنید تا هم تخصیص ها و هم اندازه کم عمق را تجسم کنید.

تخصیص و اندازه کم عمق را تجسم کنید
شکل 7. نمایه ساز حافظه که تخصیص ها و اندازه ها را برای یک محدوده انتخاب شده در جدول زمانی نشان می دهد.

روش های مختلفی برای مرتب سازی این داده ها وجود دارد. بخش‌های زیر نمونه‌هایی از این که چگونه هر نما می‌تواند به شما در تجزیه و تحلیل مسائل کمک کند، ارائه می‌کند.

بر اساس کلاس ترتیب دهید

مرتب سازی بر اساس کلاس زمانی مفید است که می خواهید کلاس هایی را بیابید که در حال تولید اشیایی هستند که در غیر این صورت باید در حافظه پنهان ذخیره شوند یا دوباره از یک مخزن حافظه استفاده شوند.

برای مثال، تصور کنید اپلیکیشنی را می‌بینید که در هر ثانیه 2000 شی با کلاس به نام Vertex ایجاد می‌کند. این امر تعداد تخصیص ها را در هر ثانیه 2000 افزایش می دهد و هنگام مرتب سازی بر اساس کلاس آن را مشاهده می کنید. آیا برای جلوگیری از تولید آن زباله باید از چنین اشیایی دوباره استفاده کرد؟ اگر پاسخ مثبت است، احتمالاً به پیاده‌سازی یک مخزن حافظه نیاز خواهد بود.

ترتیب با پشته تماس

مرتب سازی توسط callstack زمانی مفید است که یک مسیر داغ وجود دارد که حافظه در آن تخصیص داده می شود، مانند داخل یک حلقه یا یک تابع خاص که کارهای تخصیص زیادی را انجام می دهد. مشاهده توسط callstack به شما امکان می دهد آن نقاط تخصیص را ببینید.

کم عمق در مقابل اندازه حفظ شده

اندازه کم عمق فقط حافظه خود شی را ردیابی می کند، بنابراین برای ردیابی کلاس های ساده که عمدتاً از موارد اولیه تشکیل شده اند بسیار مفید است.

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

تخلیه کامل حافظه
شکل 8. شما می توانید در هر زمان که بخواهید با کلیک بر روی دکمه Dump Java heap در نوار ابزار نمایه کننده حافظه، یک حافظه خالی ایجاد کنید.

به عنوان ستون اضافه شد
شکل 9. ایجاد یک حافظه خالی ستونی را نشان می دهد که تخصیص اشیا را در آن پشته نشان می دهد.

3. اندازه گیری تاثیر یک بهینه سازی

یکی از بهبودهای بهینه سازی حافظه که اندازه گیری آن آسان است، جمع آوری زباله است. هنگامی که یک بهینه سازی فشار حافظه را کاهش می دهد، باید مجموعه های زباله (GC) کمتری را مشاهده کنید. برای اندازه گیری این، زمان بین GC ها را در جدول زمانی پروفایلر اندازه گیری کنید. پس از بهینه سازی حافظه، باید مدت زمان بیشتری را بین GCها مشاهده کنید.

تأثیر نهایی بهبودهای حافظه مانند موارد زیر است:

  • اگر برنامه دائماً فشار حافظه نداشته باشد، برنامه کمتر به دلیل مشکلات حافظه از بین می رود.
  • داشتن GC کمتر، معیارهای jank را بهبود می بخشد. این به این دلیل است که GC ها باعث ایجاد اختلاف در CPU می شوند که می تواند منجر به به تعویق افتادن وظایف رندر در حین انجام GC شود.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% endverbatim %}،

این مثال‌ها نحوه استفاده از ردیابی سیستم با Macrobenchmark را به همراه پروفایل حافظه برای اندازه‌گیری و بهبود انواع خاصی از مشکلات عملکرد نشان می‌دهند.

اشکال زدایی راه اندازی برنامه با استفاده از systrace

هنگام اشکال‌زدایی زمان راه‌اندازی، توصیه می‌کنیم از گزارش‌های systrace استفاده کنید. Systrace سیستمی است که از کدهای از پیش ابزار دقیق برای خروجی گرفتن مدت زمانی که رویدادهای خاص در زمان وقوع آنها طول می کشد استفاده می کند. این ردیابی‌ها به شما امکان می‌دهند آنچه را که در برنامه شما یا حتی در فرآیندهای دیگر در سراسر سیستم اتفاق می‌افتد، مشاهده کنید. پلتفرم Android و کتابخانه‌های Jetpack دارای ابزار دقیقی در مورد بسیاری از رویدادهای کلیدی در یک برنامه هستند، و این موارد مطابق با آن ثبت می‌شوند. همچنین می‌توانید برنامه‌های خود را با ردیابی‌های سفارشی خود، که در همان ابزارهای تجسم systrace نشان داده می‌شوند، تنظیم کنید تا تصویری کلی از آنچه در برنامه اتفاق افتاده است ارائه دهید.

با استفاده از systrace یا Perfetto

برای کسب اطلاعات بیشتر در مورد استفاده اولیه از systrace، ویدیوی زیر را ببینید: اشکال زدایی عملکرد برنامه .

برای تجزیه و تحلیل زمان راه اندازی، ابتدا باید بفهمید که در طول راه اندازی چه اتفاقی می افتد. اگر اطلاعات بیشتری نسبت به آنچه در این صفحه توضیح داده شده می‌خواهید، مستندات مربوط به زمان راه‌اندازی برنامه یک نمای کلی از روند راه‌اندازی برنامه ارائه می‌دهد.

مراحل راه اندازی اپلیکیشن عبارتند از:

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

انواع استارت آپ دارای مراحل زیر هستند:

  • شروع سرد: این زمانی اتفاق می‌افتد که برنامه برای اولین بار از زمان راه‌اندازی یا از زمانی که فرآیند برنامه از بین رفته است، چه توسط کاربر یا توسط سیستم، شروع شود. راه اندازی یک فرآیند جدید بدون حالت ذخیره شده ایجاد می کند.
  • شروع گرم: این زمانی اتفاق می‌افتد که برنامه از قبل در پس‌زمینه اجرا می‌شود، اما فعالیت باید دوباره ایجاد شود و در پیش‌زمینه قرار گیرد. اکتیویتی یا در حین استفاده مجدد از فرآیند موجود دوباره ایجاد می شود، یا فرآیند با حالت ذخیره شده دوباره ایجاد می شود. کتابخانه تست Macrobenchmark با استفاده از اولین گزینه از تست راه اندازی گرم سازگار پشتیبانی می کند.
  • شروع داغ: این زمانی اتفاق می‌افتد که فرآیند و فعالیت هنوز در حال اجرا هستند و صرفاً باید به پیش‌زمینه آورده شوند، احتمالاً برخی از اشیاء در صورت لزوم بازسازی شوند، و همچنین فعالیت پیش‌زمینه جدید ارائه شود. این کوتاه ترین سناریوی راه اندازی است.

توصیه می‌کنیم systraces را با استفاده از برنامه ردیابی سیستم موجود در Developer Options در دستگاه ضبط کنید. اگر می‌خواهید از ابزارهای خط فرمان استفاده کنید، Perfetto برای استفاده با Android 10 (سطح API 29) و بالاتر در دسترس است، در حالی که دستگاه‌های نسخه‌های قبلی باید از systrace استفاده کنند.

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

در صورت امکان، توصیه می‌کنیم یک تماس reportFullyDrawn (موجود در Android 10 و بالاتر) را هنگام اتمام راه‌اندازی از منظر برنامه اضافه کنید.

برخی از مواردی که باید در این ردیابی سیستم جستجو کنید عبارتند از:

Monitor contention
شکل 1. رقابت برای منابع محافظت شده توسط مانیتور می تواند تاخیر قابل توجهی در راه اندازی برنامه ایجاد کند.

معاملات بایندر همزمان
شکل 2. به دنبال تراکنش های غیر ضروری در مسیر بحرانی برنامه خود باشید.

جمع آوری همزمان زباله
شکل 3. جمع‌آوری همزمان زباله رایج است و تأثیر نسبتاً کمی دارد، اما اگر به آن ضربه می‌زنید اغلب آن را با نمایه‌ساز حافظه Android Studio بررسی کنید.

I/O هنگام راه اندازی
شکل 4. ورودی/خروجی را در حین راه اندازی بررسی کنید و به دنبال غرفه های طولانی باشید.

در شکل 4، توجه داشته باشید که سایر فرآیندهایی که همزمان I/O را انجام می‌دهند، می‌توانند باعث مشاجره I/O شوند، بنابراین مطمئن شوید که سایر فرآیندها اجرا نمی‌شوند.

فعالیت قابل توجه در رشته‌های دیگر می‌تواند با رشته رابط کاربری تداخل داشته باشد، بنابراین در هنگام راه‌اندازی مراقب کار پس‌زمینه باشید. توجه داشته باشید که دستگاه‌ها می‌توانند پیکربندی‌های CPU مختلفی داشته باشند، بنابراین تعداد رشته‌هایی که می‌توانند به صورت موازی اجرا شوند می‌تواند در دستگاه‌ها متفاوت باشد.

همچنین راهنمای منابع رایج jank را بررسی کنید

از نمایه کننده حافظه اندروید استودیو استفاده کنید

نمایه‌ساز حافظه اندروید استودیو ابزاری قدرتمند برای کاهش فشار حافظه است که می‌تواند ناشی از نشت حافظه یا الگوهای بد استفاده باشد. این یک نمای زنده از تخصیص و مجموعه اشیاء را ارائه می دهد.

برای رفع مشکلات حافظه در برنامه‌تان، می‌توانید از نمایه‌گر حافظه برای ردیابی چرایی و تعداد دفعات جمع‌آوری زباله‌ها، و همچنین وجود نشت حافظه احتمالی که باعث می‌شود هیپ شما در طول زمان دائماً افزایش یابد، استفاده کنید.

نمایه سازی حافظه برنامه به مراحل زیر تقسیم می شود:

1. مشکلات حافظه را تشخیص دهید

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

افزایش تعداد اشیا
شکل 5. نمایه ساز حافظه افزایش تخصیص اشیا را در طول زمان نشان می دهد.

جمع آوری زباله
شکل 6. نمایه ساز حافظه که رویدادهای جمع آوری زباله را نشان می دهد.{.:image-caption}

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

2. نقاط داغ فشار حافظه را تشخیص دهید

محدوده ای را در جدول زمانی انتخاب کنید تا هم تخصیص ها و هم اندازه کم عمق را تجسم کنید.

تخصیص و اندازه کم عمق را تجسم کنید
شکل 7. نمایه ساز حافظه که تخصیص ها و اندازه ها را برای یک محدوده انتخاب شده در جدول زمانی نشان می دهد.

روش های مختلفی برای مرتب سازی این داده ها وجود دارد. بخش‌های زیر نمونه‌هایی از این که چگونه هر نما می‌تواند به شما در تجزیه و تحلیل مسائل کمک کند، ارائه می‌کند.

بر اساس کلاس ترتیب دهید

مرتب سازی بر اساس کلاس زمانی مفید است که می خواهید کلاس هایی را بیابید که در حال تولید اشیایی هستند که در غیر این صورت باید در حافظه پنهان ذخیره شوند یا دوباره از یک مخزن حافظه استفاده شوند.

برای مثال، تصور کنید اپلیکیشنی را می‌بینید که در هر ثانیه 2000 شی با کلاس به نام Vertex ایجاد می‌کند. این امر تعداد تخصیص ها را در هر ثانیه 2000 افزایش می دهد و هنگام مرتب سازی بر اساس کلاس آن را مشاهده می کنید. آیا برای جلوگیری از تولید آن زباله باید از چنین اشیایی دوباره استفاده کرد؟ اگر پاسخ مثبت است، احتمالاً به پیاده‌سازی یک مخزن حافظه نیاز خواهد بود.

ترتیب توسط Callstack

تنظیم توسط CallStack در زمانی که یک مسیر داغ در جایی که حافظه اختصاص می یابد ، مفید است ، مانند داخل یک حلقه یا یک عملکرد خاص که کارهای تخصیص زیادی را انجام می دهد. مشاهده توسط CallStack به شما امکان می دهد آن نقاط تخصیص را ببینید.

کم عمق در مقابل اندازه حفظ شده

اندازه کم عمق فقط حافظه خود شیء را ردیابی می کند ، بنابراین برای ردیابی کلاسهای ساده متشکل از اولویت های اولیه مفید است.

اندازه حفظ شده ، کل حافظه اختصاص داده شده توسط شی را مستقیماً و همچنین سایر اشیاء اختصاص داده شده که صرفاً توسط شیء ارجاع می شوند ، نشان می دهد. برای ردیابی فشار حافظه به دلیل اشیاء پیچیده که نیاز به تخصیص سایر اشیاء و نه فقط زمینه های ابتدایی ندارند ، مفید است. برای به دست آوردن این مقدار ، با استفاده از پروفایل حافظه ، یک دامنه حافظه ایجاد کنید. اشیاء اختصاص یافته در آن پشته به صفحه نمایش اضافه می شوند.

زباله حافظه کامل
شکل 8. شما می توانید با کلیک بر روی دکمه Dump Java Heap در نوار ابزار Profiler Memory ، یک زباله حافظه ایجاد کنید.

به عنوان ستون اضافه شده است
شکل 9. Crearting A Damp Memory ستونی را نشان می دهد که تخصیص شیء را در آن پشته نشان می دهد.

3. تأثیر بهینه سازی را اندازه گیری کنید

یک بهبود بهینه سازی حافظه که اندازه گیری آن آسان است ، جمع آوری زباله است. هنگامی که بهینه سازی فشار حافظه را کاهش می دهد ، باید تعداد کمتری از مجموعه زباله ها (GC) را ببینید. برای اندازه گیری این ، زمان بین GCS را در جدول زمانی Profiler اندازه گیری کنید. پس از بهینه سازی حافظه باید مدت زمان طولانی تری بین GCS مشاهده کنید.

تأثیر نهایی بهبود حافظه مانند این موارد است:

  • اگر برنامه دائماً فشار حافظه نداشته باشد ، این برنامه به دلیل عدم وجود حافظه ، کمتر کشته می شود.
  • داشتن GCS کمتری ، معیارهای Jank را بهبود می بخشد. این امر به این دلیل است که GC ها باعث مشاجره CPU می شوند ، که می تواند منجر به تعویق در هنگام وقوع GC شود.
{% کلمه به کلمه %} {% آخر کلمه %} {% کلمه به کلمه %} {% آخر کلمه %}