הצגת פרופילים בממשק המשתמש של Perfetto

אחרי שמאחזרים פרופיל ממכשיר בדיקה או מורידים אותו מה-backend, אפשר לפתוח את הקובץ בממשק המשתמש של Perfetto כדי לבדוק את צירי הזמן, מצבי השרשורים ותרשימי שמירת הנתונים בזיכרון. בדף הזה מוסבר איך לנווט בעקבות המערכת המצונזרות ובתמונות המצב של הזיכרון ב-Java שצולמו באמצעות ProfilingManager.

הצגה חזותית של עקבות המערכת

פותחים את הקובץ .perfetto-trace בממשק המשתמש של Perfetto כדי לבדוק את הפעילות של המעבד (CPU) והשרשור לאורך זמן.

ציר זמן של עקבות מערכת מצונזרות בממשק המשתמש של Perfetto
איור 1. דוגמה למעקב מצונזר.

כדי להגן על פרטיות המשתמשים, ProfilingManager מצנזר את עקבות המערכת על ידי שילוב של פעילות המעבד מכל התהליכים האחרים בטראק OtherProcesses יחיד. בדיקה של הטראק המשולב הזה עדיין מאפשרת לכם לקבוע אם האיטיות באפליקציה נגרמה בגלל צוואר בקבוק פנימי או עומס כולל על המכשיר.

באיור 2 מודגשים החלקים העיקריים של עקבות המערכת שצונזרו:

קטעים ממוספרים של עקבות מערכת מצונזרים בממשק המשתמש של Perfetto
איור 2. קטעים של מעקב מצונזר.
  1. רשימת מעבדים (CPU): מציגה את כל המעבדים הזמינים במכשיר.
  2. משימות מעבד (CPU): מראה אילו שרשורים כל מעבד (CPU) הפעיל.
  3. תצוגת תהליכים אחרים: מציגה את משאבי המעבד (CPU) שנצרכים על ידי תהליכים אחרים.
  4. תצוגת תהליך: מציגה את התהליך של האפליקציה.
  5. תצוגת השרשורים: מציגה את השרשורים שפועלים בתהליך ואת מצבי השרשורים (ניתן להרצה (R), פועל (R), במצב שינה (S), במצב שינה ללא הפרעה (D)), שממופים ישירות למצבי התהליך של Linux.
  6. פרוסות מעקב: בקטע הזה מוצגות הערות מעקב שנוספו על ידי מפתחי האפליקציה או המסגרת. ההערות האלה כוללות חישובים בין Trace.beginSection ל-Trace.endSection.

מידע נוסף על ממשק המשתמש של Perfetto ועל תצוגה חזותית של מעקב זמין במסמכי התיעוד של Perfetto.

המחשה של תמונות מצב של הזיכרון מ-Java

אחרי שיוצרים תמונת מצב של הזיכרון מ-Java באמצעות PROFILING_TYPE_JAVA_HEAP_DUMP, פותחים את קובץ ה-.perfetto-java-heap-dump שנוצר בממשק המשתמש של Perfetto כדי לזהות דליפות זיכרון או לבצע אופטימיזציה של השימוש בזיכרון. ב-Heapdump Explorer, אתם יכולים לבחון את תרשים ה-heap, לבדוק תרשימי להבות (flame graph) של גודלי אובייקטים מצטברים ולעיין במחלקות, באובייקטים ובדומינטורים, כמו שמוצג באיור 3.

‫Heapdump Explorer בממשק המשתמש של Perfetto, שבו מוצג תרשים להבות (flame graph) של גודלי אובייקטים בערימה (heap) של Java.
איור 3. תרשים להבות (flame graph) של תמונת מצב של הזיכרון מ-Java בממשק המשתמש של Perfetto.

מה ההבדל בין תמונות מצב של הזיכרון ב-ProfilingManager לבין תמונות מצב ב-HPROF

בניגוד לתמונות מצב רגילות של הזיכרון ב-.hprof (כמו אלה שנוצרו באמצעות Debug.dumpHprofData או ב-Android Studio), ב-ProfilingManager נוצרת תמונת מצב של הזיכרון ב-Perfetto ART (.perfetto-java-heap-dump). במקום ליצור תמונת מצב של תוכן הזיכרון הגולמי, ב-ProfilingManager מתועדים תרשים שמירת האובייקטים והמטא-נתונים של הגודל, ומושמטים הנתונים הגולמיים שמאוחסנים בתוך האובייקטים:

  • מה נאסף:
    • מחלקות וסוגים: שמות מחלקות, היררכיות של מחלקות ראשיות, טועני מחלקות, גודלי מופעים וסוגי הפניות (כמו מחלקות רגילות, מערכים, מחרוזות או הפניות חלשות, רכות, פיינלייזר ופנטום).
    • מופעים וגדלים של אובייקטים: הנפח הבסיסי (shallow size) של כל אובייקט (self_size), אזור ה-heap שלו (HEAP_TYPE_APP,‏ HEAP_TYPE_ZYGOTE או HEAP_TYPE_BOOT_IMAGE) והזיכרון המקורי המשויך שרשום דרך NativeAllocationRegistry.
    • הפניות ורכיבי GC בסיסיים: רכיבי Garbage Collection בסיסיים (כמו משתנים גלובליים ומקומיים של JNI, מסגרות סטאק של Java ואובייקטים של שרשורים) ושרשראות של הפניות ברמת השדה שמראות איזה אובייקט שומר אובייקט אחר ובאמצעות איזה שם שדה.
    • מטא-נתונים נבחרים לגבי גודל: מטא-נתונים לא רגישים לגבי סוגים ספציפיים של מסגרות, כמו מאפייני Bitmap (mWidth ו-mHeight).
  • מה לא נכלל: ערכים של שדות פרימיטיביים בפועל, תוכן של תווים מסוג String ומטענים ייעודיים (payloads) של מערכים גולמיים (byte[],‏ char[] ומערכים פרימיטיביים אחרים). השמטת התוכן הגולמי של האובייקטים מגינה על פרטיות המשתמשים במכשירי ייצור, ומקטינה משמעותית את קובצי ה-dump.

השלבים הבאים

בנוסף לבדיקה חזותית בממשק המשתמש של Perfetto, אתם יכולים להריץ שאילתות על פרופילים באמצעות PerfettoSQL, לנתח עקבות בכמות גדולה או לנתח פרופילים באמצעות AI.