פלטפורמת Android פועלת על בסיס ההנחה שזיכרון פנוי הוא זיכרון מבוזבז. מערכת Android מנסה להשתמש בכל הזיכרון הזמין בכל רגע. לדוגמה, המערכת שומרת אפליקציות בזיכרון אחרי שהן נסגרות, כדי שהמשתמש יוכל לחזור אליהן במהירות. לכן, מכשירי Android פועלים לעיתים קרובות עם מעט מאוד זיכרון פנוי (אפשר לעיין בהקצאת הזיכרון ב-Android כאן).
התהליך של הדמון LMK (הפסקת תהליכים בגלל מחסור בזיכרון) ב-Android עוקב אחרי מצב הזיכרון של מערכת Android שפועלת, ומגיב לעומס גבוה על הזיכרון על ידי הפסקת התהליכים הכי פחות חיוניים כדי לשמור על רמת ביצועים מקובלת של המערכת.
כדי להחליט איזה תהליך להפסיק, דמון LMK משתמש בציון out of memory שנקרא oom_adj_score כדי לתת עדיפות לתהליכים הפועלים. תהליכים עם ציון גבוה יופסקו קודם. קודם כל מופסקות אפליקציות ברקע, ואחרונות מופסקות אפליקציות מערכת. בטבלה הבאה מפורטות קטגוריות הניקוד של LMK, מהגבוה לנמוך. פריטים בקטגוריה עם הניקוד הכי גבוה, בשורה הראשונה, מושבתים ראשונים:
כלים לפרופיילינג של הזיכרון
הכלים הבאים יכולים לעזור לכם למצוא בעיות בזיכרון ולאבחן אותן בדרכים הבאות:
- אפשר לראות איך הזיכרון מוקצה לאפליקציה לאורך זמן. אפשר לראות תרשים בזמן אמת של כמות הזיכרון שבה נעשה שימוש באפליקציה, מספר אובייקטי Java שהוקצו ומתי מתבצע מנגנון איסוף זבל.
- מפעילים אירועים של מנגנון איסוף זבל ויוצרים תמונת מצב של ה-heap ב-Java בזמן שהאפליקציה פועלת.
- תיעוד של הקצאות הזיכרון באפליקציה, בדיקה של כל האובייקטים שהוקצו ותצוגה של דוח קריסות לכל הקצאה.
אם המשחק שלכם פועל במנוע מקורי, תוכלו להשתמש ב-HWAddress Sanitizer כדי לנפות באגים בהקצאת זיכרון מקורי.
Android Studio Memory Profiler
Android Studio מספק את Memory Profiler כרכיב של Android Profiler. בעזרת הכלי הזה אפשר לזהות דליפות זיכרון והעמסת זיכרון שעלולים לגרום לגמגום, להקפאה ואפילו לקריסות של האפליקציה. בכלי ליצירת פרופילים מוצג תרשים בזמן אמת של השימוש בזיכרון באפליקציה, והוא מאפשר לכם לצלם תמונת מצב של הזיכרון, להפעיל מנגנון איסוף זבל ולעקוב אחרי הקצאת הזיכרון.
כלי פרופיילינג של הזיכרון ב-Unity
אם אתם משתמשים ב-Unity Engine כדי ליצור את האפליקציות שלכם, תוכלו לפעול לפי ההנחיות ליצירת פרופיל זיכרון ב-Unity. Unity מציעה שני כלים לניתוח השימוש בזיכרון באפליקציה ב-Unity.
הראשון הוא מודול Memory Profiler, שהוא כלי פרופילים מובנה שמספק מידע בסיסי על המקומות שבהם האפליקציה משתמשת בזיכרון.
הכלי השני הוא חבילת Memory Profiler, שהיא חבילת Unity שאפשר להוסיף לפרויקט. החבילה מוסיפה חלון נוסף של Memory Profiler ל-Unity Editor. ה-Memory Profiler מאפשר לכם לנתח את השימוש בזיכרון באפליקציה שלכם בפירוט רב עוד יותר. אפשר לאחסן תמונות מצב ולהשוות ביניהן כדי למצוא דליפות זיכרון או לראות את פריסת הזיכרון כדי למצוא בעיות של פיצול זיכרון.
Unreal Memory Insights
אפליקציות שמבוססות על Unreal Engine יכולות להשתמש ב-Unreal Memory Insights כדי לראות מידע מפורט על הקצאת זיכרון וביטול הקצאה של זיכרון, כולל תגי Low Level Memory (LLM) ו-callstacks שמשויכים לבלוקים של זיכרון.
מערכת השאילתות של Memory Insights יכולה למצוא הקצאות פעילות בכל נקודת זמן, לזהות שינויים בשימוש בזיכרון, לאתר דליפות זיכרון ולהבחין בין הקצאות לטווח קצר לבין הקצאות לטווח ארוך.
מגרסה UE 5.4, הכלי Memory Insights תומך במעקב אחר זיכרון עם מחסניות קריאות לפרויקטים של Android.
תובנות לגבי זיכרון נמוך
מערכת Android מספקת קריאות חוזרות (callbacks) וממשקי API שמאפשרים לצמצם את דרישות הזיכרון של המשחק ולקבוע למה הפעלות קודמות של המשחק הסתיימו.
התקשרות חזרה
אל תירשמו לקבלת קריאות חוזרות (callback) של trim שהוצאו משימוש. ל-Android אין ממשקי API לזיהוי אירועים של עומס על הזיכרון המקומי כשהמערכת מגיעה למגבלות הזיכרון.
הפונקציות החוזרות (callback) של Trim לא עזרו למנוע סגירה של אפליקציות בגלל מחסור בזיכרון, ולכן הוצאו משימוש ב-Android כולן מלבד TRIM_MEMORY_UI_HIDDEN ו-TRIM_MEMORY_BACKGROUND.
סיום המשחק
מערכת Android מנסה להשתמש בכל הזיכרון שזמין כדי לשמור במטמון אפליקציות ומשחקים, כדי להבטיח שהם ייטענו במהירות (וכך לשפר את חוויית המשתמש). אבל כשהזיכרון מוגבל, המערכת סוגרת את האפליקציות והמשחקים שהכי אינטנסיביים מבחינת השימוש בזיכרון, כדי לפנות זיכרון לפעולה תקינה של המכשיר.
המידע, התובנות והשיטות המומלצות הבאים יעזרו לכם לשפר את השימוש בזיכרון במשחק:
- משתמשים ב-
ApplicationExitInfo: ה-API הזה מחזיר את הסיבה לכך שהמערכת של Android סגרה את ההפעלה הקודמת של המשחק. אפשר להשתמש ב-ApplicationExitInfoכדי לבדוק אם זיכרון נמוך הוא הסיבה לסיום של ריצת תהליך קודמת. בודקים אם המשחק נסגר בגלל מחסור בזיכרון, כדי שאפשר יהיה לבצע אופטימיזציה של המשחק כך שישתמש בפחות זיכרון במכשיר הזה. - בודקים את הזיכרון הפיזי הכולל מסוג RAM:
כדי למנוע את סגירת המשחקים כשהם פועלים ברקע, וכדי להתאים את השימוש בזיכרון המשחק ליכולות המכשיר, בודקים את הזיכרון הפיזי הכולל מסוג RAM לכל מכשיר. כך אפשר להתאים את השימוש בזיכרון המשחק בצורה מדויקת. אם המטרה היא למנוע את סגירת האפליקציות זמן קצר אחרי שהן עוברות לרקע (כדי לאפשר לשחקן לבצע כמה משימות בו-זמנית), צריך להשתמש בקריאות החוזרות (callback) של trim (
TRIM_MEMORY_UI_HIDDENבאופן ספציפי) כדי לצמצם את השימוש בזיכרון של המשחק.