מפות סיביות הן לרוב האובייקטים הכי גדולים שצורכים זיכרון באפליקציה. פעולות של פענוח ושינוי גודל נמצאות לעיתים קרובות בנתיב הקריטי של עיבוד הפריים. אופטימיזציה של השימוש בזיכרון של מפת הסיביות (bitmap) משפרת באופן משמעותי את מהירות התגובה של ממשק המשתמש, את חיי הסוללה ואת היציבות הכוללת, על ידי צמצום בעיות בממשק (jank), שגיאות ANR וסגירת תהליכים שקשורים לשגיאות OOM.
זיהוי שימוש גבוה בזיכרון של מפת הסיביות (bitmap)
בתפקוד האפליקציה מוצגים מדדים לגבי טביעת הרגל של זיכרון מפת הסיביות של האפליקציה, על ידי צבירת נתונים ממכשירי Android. כברירת מחדל, המדדים האלה מחושבים בתור סיכום של נתונים יומיים במשך 28 ימים. הנתונים האלה עוזרים לזהות מגמות ונסיגות פוטנציאליות ביעילות הזיכרון בסוגים ובגרסאות שונים של מכשירים.
בנתונים של מדד תפקוד האפליקציה ל-Android אפשר לראות את השימוש בזיכרון של מפת הסיביות (bitmap) באפליקציה, לפי מצבי התהליך הבאים:
- בחזית: התהליך של האפליקציה גלוי. הערך הצפוי של P99 גבוה משמעותית ברקע הקדמי לעומת מצבי תהליך אחרים, אבל מפתחים צריכים לבדוק אם היחס בין P99 ל-P50 משמעותי (למשל, גבוה מפי 3.5), כי לרוב זה מצביע על דליפת זיכרון של מפת סיביות. אפשר לזהות את הבעיה הזו על ידי השוואה בין השימוש הטיפוסי (אחוזון 50) לבין השימוש החריג (אחוזון 99). בעוד שנפח נכסים גדול מדי מגדיל את השימוש בזיכרון באופן אחיד בכל האחוזונים, דליפות זיכרון מצטברות לאורך זמן וגורמות להטיה חזקה בנתונים של הקצה העליון (אחוזון 99). מוודאים שהקצאות של מפות סיביות בחזית לא נשמרות שלא לצורך אחרי שהאפליקציה עוברת למצבים אחרים.
- שירותים שמשפיעים על המשתמשים: התהליך של האפליקציה פועל במצב מורגש. ההגבלה כוללת שירותים שפועלים ברקע, משימות מואצות ומשימות של העברת נתונים ביוזמת המשתמשים. אסור לאפליקציות לשמור הקצאות כבדות של מפת סיביות בחזית כשהן עוברות למצבים האלה. השירותים האלה מיועדים למשימות שרצות לאורך זמן, ולכן שמירה של נכסים גדולים פוגעת בחוויית המשתמש הכוללת ומאלצת את Low Memory Killer Daemon (LMKD) לפנות זיכרון על ידי סגירה של תהליכים עם עדיפות נמוכה יותר.
- רקע: האפליקציה מפעילה שירות הפועל ברקע, או שהועברה לאחרונה לרקע, אבל עדיין לא נשמרה במטמון. מצב התהליך הזה פחות חשוב מתהליכים שפועלים בחזית או מתהליכים שניתנים לתפיסה, ולכן אפליקציות צריכות לשחרר כאן באופן מפורש נכסי מפת סיביות גדולים כדי להפחית את העומס על הזיכרון.
- במטמון: האפליקציה נמצאת במצב שמירה במטמון. המצב הזה רגיש מאוד לעומס על זיכרון המערכת, כמו LMK. כדי למנוע את ההוצאה של האפליקציות מהזיכרון על ידי מערכת ההפעלה, הן צריכות להפחית באופן יזום את השימוש בזיכרון של מפת הסיביות במצב הזה.
גורמים לשימוש גבוה בזיכרון של מפת הסיביות
יכול להיות שגם זיכרון וירטואלי שלא נעשה בו שימוש ייכלל בחישוב. אם אתם רואים שימוש גבוה באופן לא צפוי בזיכרון של מפת הסיביות (bitmap), ודאו שאתם לא מקצים זיכרון שלא נעשה בו שימוש.