فحص استخدام الذاكرة لتطبيقك باستخدام أداة "ذاكرة الذاكرة"

"محلّل الذاكرة" هو أحد المكوّنات في محلّل Android الذي يساعدك في تحديد تسرّبات الذاكرة وحالات إيقاف الذاكرة التي يمكن أن تؤدي إلى تعطُّل وتوقّف الجهاز وحتى أعطال التطبيق. ويعرض التطبيق رسمًا بيانيًا في الوقت الفعلي لاستخدام ذاكرة تطبيقك ويتيح لك التقاط نَسْخ للذاكرة، وفرض مجموعات النفايات، وتتبُّع تخصيصات الذاكرة.

لفتح "أداة تحليل الذاكرة"، اتّبِع الخطوات التالية:

  1. انقر على عرض > أداة Windows > الملف الشخصي (يمكنك أيضًا النقر على الملف الشخصي في شريط الأدوات).
  2. اختَر الجهاز والتطبيق الذي تريد تحديد ملفه الشخصي من شريط أدوات "محلّل Android". إذا كنت قد وصّلت جهازًا عبر USB ولكن لم يظهر لك ضمن القائمة، تأكّد من تفعيل تصحيح أخطاء USB.
  3. انقر على أي مكان في المخطط الزمني MEMORY لفتح "أداة تحليل الذاكرة".

يمكنك بدلاً من ذلك فحص ذاكرة التطبيق من خلال سطر الأوامر باستخدام dumpsys، وكذلك الاطّلاع على أحداث GC في logcat.

أهمية ذاكرة التخزين المؤقت للتطبيق

ويوفّر نظام التشغيل Android بيئة ذاكرة مُدارة، وعندما يُحدِّد أنّ تطبيقك لم يعُد يستخدم بعض العناصر، ستُصدِر عارضة المهملات بيانات الذاكرة غير المستخدَمة مرة أخرى في الذاكرة. يحرص نظام Android على إيجاد الذاكرة غير المستخدمة بشكل مستمر، ولكن في مرحلة ما على جميع إصدارات Android، يجب أن يتوقف النظام مؤقتًا عن الرمز. وفي معظم الأحيان، لا يمكن إيقاف تلك الفواصل مؤقتًا. وإذا كان تطبيقك يخصّص الذاكرة بشكل أسرع من نظام النظام الذي يتمكن من جمعها، قد يتأخر تطبيقك أثناء توفير المجمّع للذاكرة المتوفّرة بما يكفي لتلبية احتياجاتك. قد يؤدي هذا التأخير إلى تخطّي الإطارات والتسبّب في بطء الصورة.

حتى إذا كان تطبيقك لا يعرض بطئًا في التشغيل، إذا سرّب الذاكرة، يمكنه الاحتفاظ بهذه الذكرى حتى أثناء تشغيلها في الخلفية. ويمكن أن يؤدي هذا السلوك إلى إبطاء باقي أداء ذاكرة النظام من خلال فرض أحداث غير ضرورية لجمع البيانات غير المرغوب فيها. وأخيرًا، يضطر النظام إلى إنهاء عملية تطبيقك لاستعادة الذاكرة. بعد ذلك، عندما يعود المستخدم إلى تطبيقك، يجب إعادة تشغيله بالكامل.

للمساعدة في منع حدوث هذه المشاكل، عليك استخدام "محلّل الذاكرة" لإجراء ما يلي:

  • ابحث عن أنماط توزيع الذاكرة غير المرغوب فيها في المخطط الزمني والتي قد تسبب مشاكل في الأداء.
  • عليك إفراغ ذاكرة Java لمعرفة العناصر التي تستهلك الذاكرة في أيّ وقت. يمكن أن يساعد نَسْخ الذاكرة العديد على مدى فترة طويلة في رصد تسرّبات الذاكرة.
  • يمكنك تسجيل عمليات تخصيص الذاكرة أثناء تفاعلات المستخدم العادية والعادية لتحديد المكان الذي يخصّص فيه الرمز عددًا كبيرًا جدًا من العناصر في فترة زمنية قصيرة أو يتم تخصيص العناصر التي يتم تسرُّبها.

للحصول على معلومات حول ممارسات البرمجة التي يمكن أن تقلل من استخدام ذاكرة تطبيقك، اقرأ إدارة ذاكرة التطبيق.

نظرة عامة على مُحلّل الذاكرة

عند فتح "أداة تحليل الذاكرة" لأول مرة، سترى مخططًا زمنيًا تفصيليًا لاستخدام الذاكرة وأدوات الوصول إلى تطبيقك لفرض جمع البيانات غير المرغوب فيها وتجميع نَسْخ الذاكرة وتسجيل عمليات تخصيص الذاكرة.

الشكل 1. محلّل الذاكرة

كما هو موضّح في الشكل 1، يتضمن طريقة العرض التلقائية لمحلّل الذاكرة ما يلي:

  1. زر لفرض حدث جمع البيانات غير المرغوب فيها.
  2. زر لالتقاط نَسْخ الذاكرة.

    ملاحظة: يظهر زر لتخصيص مساحة التخزين في الذاكرة على يسار زر نَسْخ الذاكرة فقط عند الاتصال بجهاز يعمل بالإصدار Android 7.1 (مستوى واجهة برمجة التطبيقات 25) أو مستوى أدنى.

  3. قائمة منسدلة لتحديد عدد مرات التقاط المحلِّل لتخصيص الذاكرة. وقد يساعدك تحديد الخيار المناسب على تحسين أداء التطبيق أثناء إنشاء ملفات تعريفية.
  4. أزرار تكبير/تصغير المخطط الزمني.
  5. زر للانتقال سريعًا إلى بيانات الذاكرة المباشرة
  6. المخطط الزمني للحدث الذي يعرض حالات النشاط وأحداث إدخال المستخدمين وأحداث تدوير الشاشة.
  7. المخطط الزمني لاستخدام الذاكرة، والذي يتضمّن ما يلي:
    • رسم بياني مكدّس لحجم الذاكرة الذي تستخدمه كل فئة ذاكرة، كما هو موضّح في المحور ص على اليسار ومفتاح اللون في أعلى الصفحة
    • يشير الخط المتقطّع إلى عدد العناصر المخصصة، كما هو موضّح من خلال المحور ص على اليمين.
    • رمز لكل حدث جمع المهملات.

مع ذلك، إذا كنت تستخدم جهازًا يعمل بالإصدار 7.1 من نظام التشغيل Android أو إصدار أقدم، لن تظهر جميع بيانات التحليل بشكل تلقائي. إذا ظهرت لك رسالة تفيد بأن "التنسيق المتقدّم غير متاح للعملية المحدّدة"، عليك تفعيل التحليل المتقدّم للاطّلاع على ما يلي:

  • المخطط الزمني للحدث
  • عدد العناصر المخصّصة
  • أحداث جمع النفايات

في الإصدار Android 8.0 والإصدارات الأحدث، يتم دائمًا تفعيل التحليل المتقدّم للتطبيقات التي يمكن تصحيح الأخطاء فيها.

طريقة احتساب الذاكرة

تستند الأرقام التي تظهر لك في أعلى محلّ الذاكرة (الشكل 2) إلى جميع صفحات الذاكرة الخاصة التي التزم بها تطبيقك، وفقًا لنظام Android. ولا يشمل هذا العدد الصفحات التي تمت مشاركتها مع النظام أو التطبيقات الأخرى.

الشكل 2: التسمية التوضيحية لعدد الذاكرة في أعلى محلّل الذاكرة

في ما يلي فئات فئات الذاكرة:

  • Java: الذاكرة من العناصر المخصّصة من رمز Java أو لغة Kotlin.
  • أصلي: الذاكرة الواردة من العناصر المخصّصة من الرمز C أو C++

    حتى إذا لم تكن تستخدم C++ في تطبيقك، قد تظهر لك بعض الذاكرة الأصلية المستخدمة هنا لأنّ إطار عمل Android يستخدم الذاكرة الأصلية للتعامل مع مهام مختلفة بالنيابة عنك، مثلاً عند معالجة مواد عرض صور ورسومات أخرى، حتى إذا كان الرمز الذي كتبته في لغة Java أو Kotlin.

  • الرسومات: الذاكرة المستخدَمة في قوائم انتظار الرسومات البيانية لعرض وحدات البكسل على الشاشة، بما في ذلك مساحات العرض GL والزخارف GL وما إلى ذلك (يُرجى العِلم أنّ هذه هي الذاكرة التي تتم مشاركتها مع وحدة المعالجة المركزية (CPU)، وليس ذاكرة وحدة معالجة الرسومات مخصّصة).

  • حزمة التطبيقات: الذاكرة المستخدَمة في كل من الحِزم الأصلية وحِزم Java في تطبيقك. وعادةً ما يرتبط ذلك بعدد سلاسل المحادثات التي يشغّلها تطبيقك.

  • الرمز: الذاكرة التي يستخدمها تطبيقك للرموز والموارد، مثل رمز ثنائي dex أو رمز dex المحسّن أو المجمَّع ومكتبات .so والخطوط.

  • غير ذلك: الذاكرة التي يستخدمها تطبيقك والتي لا يعرف النظام كيفية تصنيفها.

  • تم تخصيصه: عدد عناصر Java/Kotlin التي خصّصها تطبيقك. لا يؤدي ذلك إلى احتساب العناصر التي تم تخصيصها في C أو C++.

    عند الاتصال بجهاز يستخدم الإصدار 7.1 من نظام التشغيل Android أو إصدارًا أقدم، يبدأ عدد التخصيص هذا في الوقت الذي يتصل فيه "محلّل الذاكرة" بتطبيقك الجاري. وبالتالي، لا يتم احتساب أي عناصر تم تخصيصها قبل بدء التحليل. يتضمّن الإصدار 8.0 من نظام Android والإصدارات الأحدث أداة مستنِدة إلى الجهاز من أجل تتبّع جميع عمليات التخصيص، لذا يمثّل هذا الرقم دائمًا إجمالي عدد عناصر Java المعلَّقة في تطبيقك على الإصدار 8.0 من Android والإصدارات الأحدث.

مقارنةً بذاكرة الذاكرة من أداة Android Monitor السابقة، يسجّل "أداة حلّ الذاكرة" الجديد ذكرياتك بشكل مختلف، لذا قد يبدو أنّ استخدامك للذاكرة أعلى من استخدام الذاكرة. يراقب "أداة تحليل الذاكرة" بعض الفئات الإضافية التي تزيد من العدد الإجمالي، ولكن إذا كنت مهتمًا فقط بذاكرة التخزين المؤقت Java، يجب أن يكون رقم "Java" مشابهًا للقيمة من الأداة السابقة. على الرغم من أنّ رقم Java قد لا يتطابق تمامًا مع الرقم الذي رأيته في Android Monitoring، فإنّ الرقم الجديد يراعي جميع صفحات الذاكرة الفعلية التي تم تخصيصها إلى ذاكرة التخزين المؤقت لتطبيقك منذ استخدامه من خلال Zygote. وهذا يوفر تمثيلاً دقيقًا لحجم الذاكرة الفعلي الذي يستخدمه تطبيقك.

عرض عمليات تخصيص الذاكرة

تعرض لك عمليات تخصيص الذاكرة كيفية تخصيص كل عنصر من عناصر Java ومرجع JNI في الذاكرة. على وجه التحديد، يمكن أن يعرض لك "محلّل الذاكرة" ما يلي عن عمليات تخصيص العناصر:

  • أنواع العناصر التي تم تخصيصها وحجم المساحة المستخدمة
  • تتبع تسلسل استدعاء الدوال البرمجية لكل عملية تخصيص، بما في ذلك سلسلة المحادثات.
  • وقت إيقاف العناصر (فقط عند استخدام جهاز يعمل بالإصدار 8.0 من نظام Android أو الإصدارات الأحدث)

لتسجيل عمليات تخصيص Java ولغة Kotlin، اختَر تسجيل عمليات تخصيص Java / Kotlin، ثم اختَر تسجيل. إذا كان الجهاز يعمل بالإصدار 8 من نظام Android أو إصدار أحدث، ينتقل واجهة مستخدم "أداة تحليل الذاكرة" إلى شاشة منفصلة تعرض التسجيل الجاري. يمكنك التفاعل مع المخطط الزمني المصغّر أعلى التسجيل (على سبيل المثال، لتغيير نطاق الاختيار). لإكمال التسجيل، اختَر إيقاف .

التمثيل البصري لتخصيصات Java في محلّل الذاكرة

في الإصدار 7.1 من نظام Android والإصدارات الأقدم، يستخدم محلّل الذاكرة تسجيل التسجيلات القديمة الذي يعرض التسجيل في المخطط الزمني إلى أن تنقر على إيقاف.

بعد اختيار منطقة من المخطط الزمني (أو عند الانتهاء من جلسة تسجيل باستخدام جهاز يعمل بالإصدار 7.1 من نظام التشغيل Android أو إصدار أقدم)، ستظهر قائمة العناصر المخصّصة، مجمّعة حسب اسم الصف وتم ترتيبها حسب عدد الثغرات في الذاكرة.

لفحص سجلّ التخصيص، اتّبِع الخطوات التالية:

  1. تصفَّح القائمة للعثور على عناصر تحتوي على أعداد كبيرة من الذاكرة غير المعتادة والتي قد يتم تسريبها. للمساعدة في العثور على الصفوف المعروفة، انقر على رأس العمود اسم الصف للترتيب أبجديًا. بعد ذلك، انقر على اسم صف. يظهر جزء عرض المثيل على يسار الصفحة، ويعرض كل مثيل من هذه الفئة، كما هو موضَّح في الشكل 3.
    • بدلاً من ذلك، يمكنك تحديد موقع العناصر بسرعة بالنقر على فلتر ، أو عن طريق الضغط على Control+F (Command+F في نظام التشغيل Mac)، وإدخال فئة أو اسم حزمة في حقل البحث. يمكنك أيضًا البحث حسب اسم الطريقة إذا اخترت الترتيب حسب ترتيب المكالمات من القائمة المنسدلة. إذا كنت تريد استخدام تعبيرات عادية، ضَع علامة في المربّع بجانب التعبير العادي. ضَع علامة في المربّع بجانب مطابقة حالة الأحرف إذا كان طلب البحث حسّاسًا لحالة الأحرف.
  2. في لوحة عرض المثيل، انقر على إحدى الآلات الافتراضية. تظهر علامة التبويب مجموعة المكالمات أدناه، وهي توضّح مكان تخصيص المثيل وسلسلة المحادثات.
  3. في علامة التبويب استدعاء الحزمة، انقر بزر الماوس الأيمن على أي سطر واختر الانتقال إلى المصدر لفتح هذا الرمز في المحرر.

الشكل 3. تظهر تفاصيل كل عنصر مخصّص في عرض المثيل على يسار الشاشة.

يمكنك استخدام القائمتَين فوق قائمة العناصر المخصّصة لاختيار الذاكرة التي تريد فحصها وكيفية تنظيم البيانات.

من القائمة على اليمين، اختَر الذاكرة التي تريد فحصها:

  • الذاكرة التلقائية: عند عدم تحديد ذاكرة المخزن المؤقت.
  • ذاكرة التخزين المؤقت للصورة: صورة تشغيل النظام التي تحتوي على الصفوف التي يتم تحميلها مسبقًا أثناء وقت التشغيل. يضمن لك التطبيق عدم تخصيص المواقع الجغرافية أو الابتعاد عنها.
  • الذاكرة المخزّنة في zygote: ذاكرة التخزين المؤقت التي يتم نسخ البيانات منها والتي يتم فيها إنشاء عملية تطبيق على نظام Android.
  • الذاكرة التخزينية للتطبيق: ذاكرة التخزين المؤقت الأساسية التي يخصص بها تطبيقك الذاكرة.
  • الذاكرة والذاكرة المتعدّدة الطبقات: يُستخدم هذا العنصر الذي يُظهر الأماكن التي يتم فيها تخصيص مراجع الإحالة Java (JNI) وإصدارها.

من القائمة على يسار الصفحة، اختَر كيفية ترتيب عمليات التوزيع:

  • الترتيب حسب الصف: تجمِّع جميع عمليات التخصيص استنادًا إلى اسم الصف. وهذا هو الخيار التلقائي.
  • الترتيب حسب الحزمة: تجمّع جميع عمليات التخصيص استنادًا إلى اسم الحزمة.
  • الترتيب حسب رد الاتصال: تجمّع جميع عمليات التخصيص في حزمة المكالمات المقابلة لها.

تحسين أداء التطبيق أثناء إنشاء المواصفات

لتحسين أداء التطبيق أثناء التحليل، يتم استخدام عيّنات الذاكرة في عمليات تخصيص الذاكرة بشكل دوري بشكل تلقائي. وعند إجراء الاختبارات على الأجهزة التي تعمل بالمستوى 26 من واجهة برمجة التطبيقات أو مستوى أعلى، يمكنك تغيير هذا السلوك باستخدام القائمة المنسدلة تتبُّع التخصيص. إليك الخيارات المتاحة:

  • كامل: يلتقط جميع عمليات تخصيص العناصر في الذاكرة. وهذا هو السلوك التلقائي في الإصدار 3.2 من "استوديو Android" والإصدارات الأقدم. إذا كان لديك تطبيق يخصِّص الكثير من العناصر، قد تلاحظ بطءًا مرئيًا في تطبيقك أثناء تحديد المواصفات.
  • العناصر المُستخدَمة: نماذج تخصيصات العناصر في الذاكرة على فترات منتظمة هذا هو الخيار التلقائي، ولن يكون له أي تأثير سلبًا في أداء التطبيق أثناء إعداد ملفات تعريف الارتباط. قد تظل التطبيقات التي تخصص الكثير من العناصر على مدار فترة زمنية قصيرة تعرض بطءًا مرئيًا.
  • إيقاف: لإيقاف تتبُّع تخصيص الذاكرة لتطبيقك.

عرض مراجع Global JNI

الواجهة المحلية للغة Java (JNI) هي إطار عمل يسمح برمز Java ورمزه الأصلي بالتواصل مع بعضهم.

تتم إدارة مراجع JNI يدويًا باستخدام الرمز الأصلي، لذلك من الممكن أن تظل عناصر Java التي يستخدمها الرمز الأصلي محفوظة لفترة طويلة جدًا. وقد يتعذّر الوصول إلى بعض العناصر في ذاكرة Java إذا تم تجاهل مرجع JNI بدون حذفها أولاً بشكل صريح. من الممكن أيضًا استنفاد الحد المرجعي العالمي للأداة JNI.

لتحديد هذه المشاكل وحلّها، استخدِم طريقة العرض الذاكرة المخزّنة في JNI في "محلّل الذاكرة" لتصفّح جميع مراجع JNI العالمية وفلترتها حسب أنواع Java ومجموعات البيانات الأصلية. باستخدام هذه المعلومات، يمكنك تحديد متى وأين تم إنشاء إشارات JNI العالمية وحذفها.

أثناء تشغيل تطبيقك، اختَر جزءًا من المخطط الزمني الذي تريد فحصه واختَر العنصر لمساعدتك في التثبيت، وذلك من القائمة المنسدلة أعلى قائمة الصفوف. يمكنك بعد ذلك فحص العناصر في ذاكرة التخزين المؤقت كما هو الحال عادةً والنقر مرتين على العناصر في علامة التبويب تخصيص المكالمات المخصّصة لمعرفة مكان تخصيص إشارات JNI وإصدارها في الرمز، كما هو موضّح في الشكل 4.

الشكل 4. عرض مراجع عالمية من "مبادرة أخبار Google"

لفحص عمليات تخصيص الذاكرة باستخدام رمز JNI لتطبيقك، عليك نشر تطبيقك على جهاز يعمل بالإصدار Android 8.0 أو إصدار أحدث.

لمزيد من المعلومات حول "مبادرة أخبار Google"، يُرجى الاطّلاع على المقالة نصائح JNI.

أداة تحليل الذاكرة الأصلية

يتضمّن "أداة تحليل الذاكرة" في "استوديو Android" أداة تحليل الذاكرة الأصلية للتطبيقات التي تم نشرها على الأجهزة الفعلية التي تعمل بالإصدار 10 من نظام التشغيل Android. يتوفّر الدعم الخاص بالأجهزة التي تعمل بنظام التشغيل Android 11 حاليًا في إصدار معاينة Android Studio 4.2.

يتتبع "أداة تحليل الذاكرة الأصلية" عمليات تخصيص/تخصيص العناصر في الرمز الأصلي لفترة زمنية محدّدة، كما يقدّم المعلومات التالية:

  • التخصيصات: عدد العناصر المخصّصة عبر malloc() أو عامل التشغيل new خلال الفترة الزمنية المحدّدة.
  • Deallocations: عدد العناصر التي تم تحديد موقعها عبر free() أو عامل التشغيل delete خلال الفترة الزمنية المحدّدة.
  • حجم التخصيصات: الحجم المجمّع بالبايت لجميع عمليات التخصيص خلال الفترة الزمنية المحددة.
  • حجم المواقع الجغرافية: الحجم المجمّع بالبايت لجميع الذاكرة التي تم إخلاءها خلال الفترة الزمنية المحدّدة.
  • إجمالي العدد: القيمة في عمود التخصيصات ناقص القيمة في عمود Deallocations.
  • الحجم المتبقي: القيمة في عمود حجم التخصيصات مطروحًا منها القيمة في عمود حجم المواقع الجغرافية.

أداة تحليل الذاكرة الأصلية

لتسجيل عمليات التوزيع الأصلي على الأجهزة التي تعمل بالإصدار 10 من نظام Android والإصدارات الأحدث، اختَر تسجيل عمليات التوزيع الأصلي، ثم اختَر تسجيل. ويستمر التسجيل إلى أن تنقر على إيقاف ، وتنتقل بعد ذلك واجهة مستخدم محلّل الذاكرة إلى شاشة منفصلة تعرض التسجيل الأصلي.

زر تسجيل عمليات تخصيص الإعلانات المدمجة مع المحتوى

وبالنسبة إلى الإصدار 9 من نظام Android والإصدارات الأقدم، لا يتوفّر خيار تسجيل عمليات التوزيع الأصلي.

وفقًا للإعدادات التلقائية، يستخدم "أداة تحليل الذاكرة الأصلية" حجم نموذج يبلغ 32 بايت: في كل مرة يتم فيها تخصيص 32 بايت من الذاكرة، يتم أخذ لقطة من الذاكرة. ويؤدي حجم العيّنة الأصغر إلى الحصول على لقطات أكثر تكرارًا، ما يؤدي إلى الحصول على بيانات أكثر دقة حول استخدام الذاكرة. ويؤدي استخدام عيّنة أكبر حجمًا إلى الحصول على بيانات أقل دقة، ولكنه سيستهلك موارد أقل على نظامك ويحسّن الأداء أثناء التسجيل.

لتغيير حجم نموذج جهاز تعيين الذاكرة الأصلي:

  1. اختَر تشغيل > تعديل الإعدادات.
  2. اختَر وحدة تطبيقك في اللوحة اليمنى.
  3. انقر على علامة التبويب تحديد المصادر وأدخِل حجم العينة في الحقل المُسمَّى الفاصل الزمني لأخذ عينات الذاكرة الأصلية (بالبايت).
  4. إنشاء تطبيقك وتشغيله مجددًا

التقاط نَسْخ للذاكرة

يوضح نَسْخ الذاكرة بعض العناصر في تطبيقك التي تستخدم الذاكرة في وقت عند نَسْخ نَسْخ الذاكرة. وعلى وجه الخصوص، بعد جلسة المستخدم الموسَّعة، يمكن أن يساعد نَسْخ الذاكرة في تحديد تسرُّبات الذاكرة من خلال عرض عناصر ما زالت في الذاكرة لا تعتقد أنّها ستكون متوفّرة بعد الآن.

بعد التقاط نَسْخ الذاكرة، يمكنك الاطّلاع على ما يلي:

  • وأنواع العناصر التي خصّصها تطبيقك وعدد العناصر التي خصّصها.
  • مقدار الذاكرة الذي يستخدمه كل عنصر.
  • الأماكن التي يتم فيها الاحتفاظ بالإشارات إلى كل عنصر في الرمز
  • حزمة المكالمات التي تم تخصيص عنصر لها (تتوفّر حِزم المكالمات حاليًا مع نَسْخ الذاكرة فقط مع الإصدار 7.1 من Android والأقل عند التقاط نَسْخ الذاكرة أثناء تسجيل عمليات التخصيص).

لتسجيل نَسْخ الذاكرة، انقر على نسخ نَسْخ الذاكرة، ثمّ اختر تسجيل. أثناء تفريغ الذاكرة، قد تزداد كمية ذاكرة Java مؤقتًا. ويُعدّ هذا أمرًا طبيعيًا لأن نَسْخ الذاكرة يحدث في العملية نفسها مثل تطبيقك ويتطلب بعض الذاكرة لجمع البيانات.

بعد انتهاء المحلّل لالتقاط نَسْخ الذاكرة، يتم نقل واجهة مستخدم محلّل الذاكرة إلى شاشة منفصلة تعرض نَسْخ الذاكرة.

الشكل 5: عرض ملف نَسْخ الذاكرة

إذا كنت بحاجة إلى معلومات أكثر دقة عن وقت إنشاء ملف التفريغ، يمكنك إنشاء نَسْخ للذاكرة للحظات المهمة في رمز التطبيق من خلال الاتصال dumpHprofData().

في قائمة الصفوف، يمكنك الاطّلاع على المعلومات التالية:

  • التخصيصات: عدد حصص التخصيص.
  • الحجم الأصلي: إجمالي مساحة الذاكرة الأصلية التي يستخدمها نوع العنصر هذا (بالبايت) لا يظهر هذا العمود إلا لنظام التشغيل Android 7.0 والإصدارات الأحدث.

    ستظهر لك هنا ذاكرة بعض العناصر التي تم تخصيصها في Java لأنّ Android يستخدم الذاكرة الأصلية لبعض فئات إطارات العمل، مثل Bitmap.

  • Shallow Size: إجمالي حجم ذاكرة Java التي يستخدمها نوع العنصر هذا (بالبايت).

  • الحجم المحتفظ به: إجمالي حجم الذاكرة التي يتم الاحتفاظ بها بسبب جميع مثيلات هذه الفئة (بالبايت).

يمكنك استخدام القائمتَين فوق قائمة العناصر المخصّصة لاختيار نَسْخ الذاكرة المطلوب فحصه وكيفية تنظيم البيانات.

من القائمة على اليمين، اختَر الذاكرة التي تريد فحصها:

  • الذاكرة التلقائية: عند عدم تحديد ذاكرة المخزن المؤقت.
  • الذاكرة التخزينية للتطبيق: ذاكرة التخزين المؤقت الأساسية التي يخصص بها تطبيقك الذاكرة.
  • ذاكرة التخزين المؤقت للصورة: صورة تشغيل النظام التي تحتوي على الصفوف التي يتم تحميلها مسبقًا أثناء وقت التشغيل. يضمن لك التطبيق عدم تخصيص المواقع الجغرافية أو الابتعاد عنها.
  • الذاكرة المخزّنة في zygote: ذاكرة التخزين المؤقت التي يتم نسخ البيانات منها والتي يتم فيها إنشاء عملية تطبيق على نظام Android.

من القائمة على يسار الصفحة، اختَر كيفية ترتيب عمليات التوزيع:

  • الترتيب حسب الصف: تجمِّع جميع عمليات التخصيص استنادًا إلى اسم الصف. وهذا هو الخيار التلقائي.
  • الترتيب حسب الحزمة: تجمّع جميع عمليات التخصيص استنادًا إلى اسم الحزمة.
  • الترتيب حسب رد الاتصال: تجمّع جميع عمليات التخصيص في حزمة المكالمات المقابلة لها. لا يعمل هذا الخيار إلا إذا سجّلت نَسْخ الذاكرة أثناء تسجيل التخصيصات. ومع ذلك، من المحتمل أن تكون هناك كائنات في الكود الذاكرة اللونية تم تخصيصها قبل بدء التسجيل، لذلك تظهر هذه التخصيصات في البداية حسب اسم الصف.

يتم ترتيب القائمة حسب عمود الحجم المحتفظ به تلقائيًا. للترتيب حسب القيم في عمود مختلف، انقر على عنوان العمود.

انقر على اسم صف لفتح نافذة عرض المثيل على يسار الصفحة (الموضّحة في الشكل 6). يتضمّن كل مثيل مُدرَج ما يلي:

  • العمق: أقصر عدد قفزات من أي جذر GC إلى مثيل محدد.
  • الحجم الأصلي: حجم هذا المثيل في الذاكرة الأصلية. لا يظهر هذا العمود إلا لنظام التشغيل Android 7.0 والإصدارات الأحدث.
  • حجم صغير: حجم هذا المثيل في ذاكرة Java.
  • الحجم المحتفظ به: حجم الذاكرة الذي يتحكم فيه هذا المثيل (وفقًا لشجرة العرض الرئيسية).

الشكل 6: تمت الإشارة إلى المدة المطلوبة لتسجيل نَسْخ الذاكرة في المخطط الزمني.

لفحص ذاكرة التخزين المؤقت، اتبع الخطوات التالية:

  1. تصفَّح القائمة للعثور على عناصر تحتوي على أعداد كبيرة من الذاكرة غير المعتادة والتي قد يتم تسريبها. للمساعدة في العثور على الصفوف المعروفة، انقر على رأس العمود اسم الصف للترتيب أبجديًا. بعد ذلك، انقر على اسم صف. تظهر لوحة عرض المثيل على يسار الصفحة، وتعرض كل مثيل من هذه الفئة، كما هو موضّح في الشكل 6.
    • بدلاً من ذلك، يمكنك تحديد موقع العناصر بسرعة بالنقر على فلتر ، أو عن طريق الضغط على Control+F (Command+F في نظام التشغيل Mac)، وإدخال فئة أو اسم حزمة في حقل البحث. يمكنك أيضًا البحث حسب اسم الطريقة إذا اخترت الترتيب حسب ترتيب المكالمات من القائمة المنسدلة. إذا كنت تريد استخدام تعبيرات عادية، ضَع علامة في المربّع بجانب التعبير العادي. ضَع علامة في المربّع بجانب مطابقة حالة الأحرف إذا كان طلب البحث حسّاسًا لحالة الأحرف.
  2. في لوحة عرض المثيل، انقر على إحدى الآلات الافتراضية. تظهر علامة التبويب المراجع أدناه، وهي تعرض كل مرجع لذلك العنصر.

    أو انقر على السهم بجانب اسم المثيل لعرض جميع حقوله، ثم انقر على اسم حقل لعرض جميع مراجعه. في حال كنت تريد الاطّلاع على تفاصيل المثيل في أحد الحقول، انقر بزر الماوس الأيمن على الحقل واختَر الانتقال إلى المثيل.

  3. في علامة التبويب المراجع، إذا عثرت على مرجع قد يؤدي إلى تخطّي الذاكرة، انقر بزر الماوس الأيمن عليه واختَر الانتقال إلى النسخة الافتراضية. يحدّد هذا الحقل المثيل المناسب من نَسْخ الذاكرة الذي يعرض بيانات النسخة الافتراضية الخاصة به.

في نَسْخ الذاكرة، ابحث عن تسرّبات الذاكرة التي سبّبها أي مما يلي:

  • إشارات طويلة الأمد إلى Activity وContext وView وDrawable وغيرها من العناصر التي قد تتضمّن إشارة إلى حاوية Activity أو Context
  • الصفوف الداخلية غير الثابتة، مثل Runnable، التي يمكن أن تحتفظ بمثيل Activity.
  • ذاكرة التخزين المؤقت التي تحتفظ بالعناصر لمدة أطول من اللازم

حفظ نَسْخ الذاكرة مثل ملف HPROF

بعد التقاط نَسْخ الذاكرة، يمكن عرض البيانات في محلّل الذاكرة فقط أثناء تشغيل المحلّل. عند الخروج من جلسة تحديد الملفات الشخصية، ستفقد نَسْخ الذاكرة. وبالتالي، إذا أردت حفظه للمراجعة لاحقًا، عليك تصدير نَسْخ الذاكرة إلى ملف HPROF. في الإصدار Android 3.1 والإصدارات الأقدم، يظهر الزر تصدير الالتقاط إلى ملف على الجانب الأيمن من شريط الأدوات أسفل المخطط الزمني. في Android Studio 3.2 والإصدارات الأحدث، يظهر الزر تصدير ذاكرة التخزين المؤقت على يسار كل إدخال تفريغ الذاكرة في لوحة الجلسات. في مربّع الحوار تصدير باسم الذي يظهر، احفظ الملف بامتداد اسم الملف .hprof.

لاستخدام أداة تحليل HPROF مختلفة مثل jhat، عليك تحويل ملف HPROF من تنسيق Android إلى تنسيق Java SE HPROF. يمكنك استخدام أداة hprof-conv المتوفّرة في الدليل android_sdk/platform-tools/. شغِّل الأمر hprof-conv مع وسيطتَين: ملف HPROF الأصلي والموقع الجغرافي لكتابة ملف HPROF الذي تم تحويله. على سبيل المثال:

hprof-conv heap-original.hprof heap-converted.hprof

استيراد ملف نَسْخ للذاكرة

لاستيراد ملف HPROF (.hprof)، انقر على بدء جلسة تحديد ملفات جديدة في لوحة الجلسات، ثم اختَر تحميل من ملف، واختر الملف من متصفح الملف.

يمكنك أيضًا استيراد ملف HPROF من خلال سحبه من متصفّح الملفات إلى نافذة محرّر.

رصد تسرُّب البيانات في "أداة تحليل الذاكرة"

عند تحليل نَسْخ الذاكرة في ملف الذاكرة، يمكنك فلترة بيانات التحليل التي يعتقد "استوديو Android" أنّها قد تشير إلى تسرّبات الذاكرة لمثيلات Activity وFragment في تطبيقك.

تتضمّن أنواع البيانات التي يعرضها الفلتر ما يلي:

  • تم تدمير Activity مثيل ولكن لا يزال تتم الإشارة إليه.
  • Fragment مثيل لا يحتوي على FragmentManager صالح ولكن لا يزال تتم الإشارة إليه.

في بعض الحالات، مثل ما يلي، قد ينتج عن الفلتر نتائج موجبة خاطئة:

  • تم إنشاء Fragment ولكن لم يتم استخدامه بعد.
  • يتم تخزين Fragment مؤقتًا، ولكن ليس كجزء من FragmentTransaction.

لاستخدام هذه الميزة، عليك أولاً التقاط محتوى نَسْخ الذاكرة أو استيراد ملف نَسْخ للذاكرة في "استوديو Android". لعرض الأجزاء والأنشطة التي قد تسرب الذاكرة، ضع علامة في مربّع الاختيار تسرّب الأنشطة/التقسيم في لوحة تفريغ الذاكرة من محلّل الذاكرة، كما هو موضّح في الشكل 7.

محلّل: رصد تسرّب الذاكرة

الشكل 7. فلترة نَسْخ الذاكرة للتسرّبات في الذاكرة

أساليب لتحديد ذاكرتك

أثناء استخدام "أداة تحليل الذاكرة"، يجب التركيز على رمز التطبيق ومحاولة فرض تسرّبات الذاكرة. إنّ إحدى الطرق التي تؤدي إلى تسرّب الذاكرة في تطبيقك هي السماح بتشغيله لفترة قصيرة قبل فحص الذاكرة. قد يتسرّب التسرّب إلى الأعلى في التخصيص في الذاكرة. ومع ذلك، كلما وقع تسرُّب البيانات، طالت مدة تشغيل التطبيق لرؤيته.

يمكنك أيضًا تفعيل تسرُّب الذاكرة بإحدى الطرق التالية:

  • يمكنك تدوير الجهاز من الوضع العمودي إلى الشاشة الأفقية ثم الرجوع عدة مرات في حالات نشاط مختلفة. غالبًا ما قد يؤدي تدوير الجهاز إلى تسرُّب عنصر Activity أو Context أو View لأن النظام يعيد إنشاء Activity، وإذا كان تطبيقك يشير إلى أحد هذه العناصر في مكان آخر، لا يمكن للنظام تجميع النفايات في المهملات.
  • يمكنك التبديل بين تطبيقك وتطبيق آخر خلال حالات النشاط المختلفة (انتقل إلى الشاشة الرئيسية، ثم عُد إلى تطبيقك).

ملاحظة: يمكنك أيضًا تنفيذ الخطوات المذكورة أعلاه باستخدام إطار عمل monkeyrunner.