يمكنك تسجيل لقطة لأجزاء من الذاكرة لمعرفة العناصر التي تستهلك الذاكرة في تطبيقك وقت الالتقاط وتحديد تسرُّب الذاكرة أو سلوك تخصيص الذاكرة ما يؤدي إلى التعثر والتوقُّف وحتى تعطُّل التطبيق. من المفيد بشكل خاص إنشاء نُسخ تخزين مؤقت للذاكرة بعد جلسة مستخدم ممتدة، عندما يمكن أن يعرض ذلك عناصر لا تزال في الذاكرة من المفترض أن يتم حذفها.
توضّح هذه الصفحة الأدوات التي يوفّرها Android Studio لجمع وتحليل عمليات تفريغ الذاكرة. بدلاً من ذلك، يمكنك فحص ذاكرة تطبيقك من ملف ملف dumpsys
والاطّلاع على
أحداث جمع المهملات في Logcat.
سبب تحليل ذاكرة تطبيقك
يوفّر Android ذاكرة مُدارة. البيئة: عندما يحدِّد Android لم يعُد تطبيقك يستخدم بعض العناصر، ستصدر أداة تجميع البيانات المهملة الذاكرة غير المستخدمة إلى كومة الذاكرة المؤقتة. يتم باستمرار تحسين الطريقة التي يتبعها Android للعثور على الذاكرة غير المستخدَمة، ولكن في مرحلة ما على جميع إصدارات Android، يجب أن يوقف النظام الرمز البرمجي مؤقتًا. في معظم الأحيان، لا يمكن ملاحظة الفواصل الزمنية. ومع ذلك، إذا كان تطبيقك يخصّص الذاكرة بشكل أسرع من قدرة النظام على جمعها، قد يتأخّر تطبيقك بينما يُفرِّغ المجمّع ذاكرة كافية لتلبية عمليات التخصيص. وقد يؤدي التأخير إلى تخطّي تطبيقك للّقطات وتسبب بطءً ملحوظًا.
حتى إذا لم يكن التطبيق يواجه بطئًا في الأداء، إذا تسبّب في تسريب الذاكرة، يمكنه الاحتفاظ تلك الذكرى حتى أثناء تشغيلها في الخلفية. يمكن أن يؤدي هذا السلوك إلى إبطاء باقي أداء ذاكرة النظام من خلال فرض أحداث جمع القمامة غير الضرورية. وفي النهاية، يضطر النظام إلى إنهاء عملية تطبيقك لاسترداد الذاكرة. وعندما يعود المستخدم إلى تطبيقك، يجب إعادة تشغيل عملية التطبيق. تمامًا.
للحصول على معلومات حول ممارسات البرمجة التي يمكن أن تقلّل ذاكرة تطبيقك يمكنك الاطّلاع على مقالة إدارة ذاكرة تطبيقك.
نظرة عامة حول تسجيل لقطات لأجزاء من الذاكرة
لالتقاط لقطة لأجزاء من الذاكرة، اختَر مهمة تحليل استخدام الذاكرة (لقطة لأجزاء من الذاكرة) (استخدِم أداة تحليل الأداء: تشغيل "التطبيق" كتطبيق قابل لتصحيح الأخطاء (البيانات الكاملة)) لالتقاط لقطة لأجزاء من الذاكرة. أثناء تفريغ الحِزمة، قد يزداد حجم ذاكرة Java بشكل مؤقت. وهذا أمر طبيعي لأنّ عملية "نسخ الذاكرة" تحدث في العملية نفسها التي يؤديها تطبيقك وتتطلّب بعض الذاكرة لجمع البيانات. بعد التقاط لقطة لأجزاء من الذاكرة، سيظهر لك ما يلي:
تعرض قائمة الصفوف المعلومات التالية:
- التخصيصات: عدد عمليات التخصيص في الذاكرة
الحجم الأصلي: إجمالي مقدار الذاكرة الأصلية المستخدَمة من قِبل هذا النوع من العناصر (بوحدة بايت). ستظهر لك ذاكرة هنا لبعض الكائنات المخصصة في Java لأن يستخدم Android ذاكرة أصلية في بعض فئات إطار العمل، مثل
Bitmap
الحجم الضحل: إجمالي حجم ذاكرة Java الذي يستخدمه هذا النوع من الكائنات (بـ بايت).
الحجم الذي تم الاحتفاظ به: إجمالي حجم الذاكرة التي يتم الاحتفاظ بها بسبب جميع مثيلات هذه الفئة (بالبايت).
استخدِم قائمة "الحِزم" لفلترة البيانات إلى حِزم معيّنة:
- كومة الذاكرة المؤقتة في التطبيقات (تلقائي): هي لقطة شاشة أساسية يخصِّصها تطبيقك للذاكرة.
- كومة الصور: صورة تشغيل النظام التي تحتوي على الفئات التي تم تحميلها مسبقًا أثناء وقت التشغيل. ولا يتم نقل المبالغ المخصّصة هنا أو إزالتها مطلقًا.
- مكبّر ذاكرة Zygote: هو مكبّر ذاكرة للنسخ عند الكتابة يتم إنشاء عملية تطبيق منه في نظام Android.
استخدِم قائمة الترتيب المنسدلة لاختيار طريقة ترتيب عمليات التخصيص:
- الترتيب حسب الفئة (تلقائي): تجميع جميع عمليات التوزيع استنادًا إلى اسم الفئة
- الترتيب حسب الحزمة: تجميع كل عمليات التوزيع استنادًا إلى اسم الحزمة
استخدِم القائمة المنسدلة "الفئة" للفلترة حسب مجموعات الصفوف:
- كل الصفوف (تلقائي): يعرض كل الصفوف، بما في ذلك الصفوف من المكتبات والتبعيات.
- عرض عمليات تسرُّب الذاكرة في النشاط/الجزء: تعرِض هذه الميزة الفئات التي تتسبّب في تسرُّب الذاكرة.
- عرض فئات المشروع: لعرض الفئات التي حدّدها مشروعك فقط.
انقر على اسم فئة لفتح جزء المثيل. يتضمن كل مثيل مدرج ما يلي:
- العمق: أقصر عدد قفزات من أي جذر GC إلى المحدد مثال.
- الحجم الأصلي: حجم هذا المثيل في الذاكرة الأصلية. هذا العمود هو مرئية فقط لنظام التشغيل Android 7.0 والإصدارات الأحدث.
- الحجم المصغّر: حجم هذه النسخة في ذاكرة 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