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

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

توضّح هذه الصفحة الأدوات التي يوفّرها Android Studio لجمع وتحليل عمليات تفريغ الذاكرة. بدلاً من ذلك، يمكنك فحص ذاكرة تطبيقك من ملف ملف dumpsys والاطّلاع على أحداث جمع المهملات في Logcat.

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

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

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

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

نظرة عامة على لقطات لأجزاء من الذاكرة

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

تعرض قائمة الصفوف المعلومات التالية:

  • عمليات التوزيع: عدد عمليات التوزيع في الحِزمة.
  • الحجم الأصلي: إجمالي مقدار الذاكرة الأصلية المستخدَمة من قِبل هذا النوع من العناصر (بوحدة بايت). ستظهر لك الذاكرة هنا لبعض العناصر المخصّصة في Java لأنّ Android يستخدم الذاكرة الأصلية لبعض فئات إطار العمل، مثل Bitmap.

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

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

استخدِم قائمة "الحِزم" لفلترة البيانات إلى حِزم معيّنة:

  • كومة التطبيق (تلقائية): هي الكومة الأساسية التي يخصّص تطبيقك الذاكرة لها.
  • Image heap: صورة تشغيل النظام التي تحتوي على الفئات المحمَّلة مسبقًا أثناء وقت التشغيل لا يتم نقل أو إزالة عمليات التخصيص هذه مطلقًا.
  • مكبّر ذاكرة Zygote: هو مكبّر ذاكرة للنسخ عند الكتابة يتم إنشاء عملية تطبيق منه في نظام Android.

استخدِم القائمة المنسدلة للترتيب لاختيار كيفية ترتيب التوزيعات:

  • الترتيب حسب الفئة (تلقائي): تجميع جميع عمليات التوزيع استنادًا إلى اسم الفئة
  • الترتيب حسب الحزمة: تجميع كل عمليات التوزيع استنادًا إلى اسم الحزمة

استخدِم القائمة المنسدلة للصفوف لفلترة المحتوى إلى مجموعات من الصفوف:

  • جميع الفئات (تلقائي): تعرِض هذه الفئة جميع الفئات، بما في ذلك الفئات من المكتبات والعناصر المُستندة إليها.
  • عرض عمليات تسرُّب الذاكرة في النشاط/الجزء: تعرِض هذه الميزة الفئات التي تتسبّب في تسرُّب الذاكرة.
  • عرض فئات المشروع: تعرِض هذه الإعدادات الفصول التي حدّدها مشروعك فقط.

انقر على اسم فئة لفتح لوحة المثيل. تتضمّن كلّ نسخة مُدرَجة ما يلي:

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

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

  • الحقول: تعرِض جميع الحقول في هذه الحالة.
  • المراجع: تعرِض كل إشارة إلى العنصر المميّز في علامة التبويب المثيل.

العثور على تسرّبات الذاكرة

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

  • نُسخ Activity التي تم إتلافها ولكن لا يزال يتمّ الرجوع إليها
  • مثيلات Fragment التي لا تحتوي على FragmentManager صالحة ولكن يتم الإشارة إليها

يُرجى العِلم أنّ الفلتر قد يعرض نتائج إيجابية خاطئة في الحالات التالية:

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

للبحث عن تسرُّب الذاكرة يدويًا بشكل أكبر، تصفَّح قوائم الفئات والعناصر للعثور على العناصر التي تحتوي على حجم محفوظ كبير. ابحث عن حالات تسرُّب الذاكرة الناتجة عن أي مما يلي:

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

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

بدء تسرّبات الذاكرة للاختبار

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

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

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

تصدير وتصدير تسجيل ملف "تجميع القمامة"

يمكنك تصدير وimportملف ملف تفريغ heap من علامة التبويب التسجيلات السابقة في أداة تحليل الأداء. يحفظ "استوديو Android" تسجيل الشاشة كملف .hprof.

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

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