بیتمپها اغلب بزرگترین اشیاء مصرفکننده حافظه در یک برنامه هستند. عملیات رمزگشایی و مقیاسبندی اغلب در مسیر بحرانی رندر فریم قرار دارند. بهینهسازی استفاده از حافظه بیتمپ با کاهش jank، ANR و توقفهای فرآیند مربوط به OOM، پیشرفتهای قابل توجهی در پاسخگویی رابط کاربری، عمر باتری و پایداری کلی ایجاد میکند.
شناسایی میزان بالای استفاده از حافظه بیتمپ
Android Vitals با جمعآوری دادهها از دستگاههای اندروید، معیارهایی را در مورد میزان مصرف حافظه بیتمپ یک برنامه ارائه میدهد. این معیارها به طور پیشفرض به صورت خلاصهای از دادههای روزانه ۲۸ روزه محاسبه میشوند. این دادهها به شناسایی روندها و رگرسیونهای احتمالی در کارایی حافظه در انواع و نسخههای مختلف دستگاه کمک میکنند.
Android Vitals میزان استفاده از حافظه بیتمپ برنامه شما را که توسط حالتهای فرآیند زیر تفکیک شده است، به اشتراک میگذارد:
- پیشزمینه : فرآیند برنامه قابل مشاهده است. انتظار میرود که P99 در پیشزمینه به طور قابل توجهی بالاتر از سایر حالتهای فرآیند باشد، اما توسعهدهندگان باید بررسی کنند که آیا نسبت P99/P50 قابل توجه است یا خیر (مثلاً بالاتر از 3.5x)، زیرا این اغلب به نشت حافظه بیتمپ اشاره دارد. میتوانید این را با جستجوی واگرایی بین استفاده معمول (P50) و استفاده پرت (P99) شناسایی کنید. در حالی که نفخ کلی دارایی، حافظه را به طور یکنواخت در تمام صدکها افزایش میدهد، نشت حافظه با گذشت زمان ترکیب میشود و دادههای انتهایی (P99) را به شدت منحرف میکند. اطمینان حاصل کنید که تخصیصهای بیتمپ پیشزمینه پس از انتقال برنامه به حالتهای دیگر، بیجهت ادامه نمییابند.
- سرویسهای درکشده توسط کاربر : فرآیند برنامه در یک وضعیت قابل درک اجرا میشود. این شامل سرویسهای پیشزمینه ، کارهای تسریعشده و کارهای انتقال داده آغازشده توسط کاربر میشود . برنامهها نباید هنگام انتقال به این وضعیتها، تخصیصهای سنگین نقشه بیتی پیشزمینه را حفظ کنند. از آنجا که این سرویسها برای وظایف طولانیمدت طراحی شدهاند، نگهداشتن داراییهای بزرگ، تجربه کلی کاربر را خراب میکند و سرویس قاتل حافظه کم (LMKD) را مجبور میکند با خاتمه دادن به فرآیندهای با اولویت پایینتر، حافظه را بازیابی کند.
- پسزمینه : برنامه در حال اجرای یک سرویس پسزمینه است، یا اخیراً در پسزمینه قرار گرفته است، اما هنوز در حافظه پنهان (cache) ذخیره نشده است. از آنجا که این وضعیت فرآیند اهمیت کمتری نسبت به فرآیندهای پیشزمینه یا قابل درک دارد، برنامهها باید صریحاً دادههای بیتمپ بزرگ را در اینجا منتشر کنند تا فشار بر حافظه کاهش یابد.
- ذخیره شده (Cached ): برنامه در حالت ذخیره شده (cache) قرار دارد. این حالت به فشار حافظه سیستم مانند LMKها بسیار حساس است. برنامهها باید در این حالت به طور فعال استفاده از حافظه بیتمپ را کاهش دهند تا از حذف شدن توسط سیستم عامل جلوگیری شود.
عوامل مؤثر در استفاده زیاد از حافظه بیتمپ
حافظه مجازی که هرگز استفاده نشده است نیز ممکن است در محاسبه لحاظ شود. اگر به طور غیرمنتظرهای شاهد استفاده زیاد از حافظه بیتمپ بودید، بررسی کنید که حافظهای را که استفاده نشده است، اختصاص نمیدهید.