يمكنك التقاط لقطة لأجزاء من الذاكرة للاطّلاع على العناصر التي تستهلك الذاكرة في تطبيقك في وقت الالتقاط وتحديد تسرُّبات الذاكرة أو سلوك تخصيص الذاكرة الذي يؤدي إلى حدوث تقطُّع وتجمُّد وحتى تعطُّل التطبيق. ويكون ذلك مفيدًا بشكل خاص عند أخذ عمليات تفريغ الذاكرة المؤقتة بعد جلسة مستخدم ممتدة، إذ يمكن أن تعرض كائنات لا تزال في الذاكرة ولكن من المفترض ألا تكون موجودة.
توضّح هذه الصفحة الأدوات التي يوفّرها "استوديو Android" لجمع وتحليل عمليات تفريغ الذاكرة المؤقتة. بدلاً من ذلك، يمكنك فحص ذاكرة تطبيقك من سطر الأوامر باستخدام dumpsys، كما يمكنك الاطّلاع على أحداث جمع البيانات غير الضرورية في Logcat.
أسباب تحليل استخدام تطبيقك للذاكرة
يوفر نظام التشغيل Android بيئة ذاكرة مُدارة، فعندما يحدّد Android أنّ تطبيقك لم يعُد يستخدم بعض العناصر، يحرّر جامع البيانات غير المرغوب فيها الذاكرة غير المستخدَمة ويعيدها إلى الكومة. نعمل باستمرار على تحسين الطريقة التي يعثر بها نظام التشغيل Android على الذاكرة غير المستخدَمة، ولكن في مرحلة ما على جميع إصدارات Android، يجب أن يوقف النظام رمزك مؤقتًا. وفي معظم الأحيان، لا يمكن ملاحظة عمليات الإيقاف المؤقت. ومع ذلك، إذا كان تطبيقك يخصّص الذاكرة بشكل أسرع من قدرة النظام على جمعها، قد يحدث تأخير في تطبيقك إلى أن يحرّر جامع البيانات مقدارًا كافيًا من الذاكرة لتلبية عمليات التخصيص. وقد يؤدي التأخير إلى تخطّي تطبيقك بعض اللقطات، ما يتسبّب في بطء ملحوظ.
حتى إذا كان تطبيقك لا يعاني من بطء في الأداء، يمكن أن يحتفظ بالذاكرة إذا كان يتسبّب في تسرّبها، حتى عندما يكون يعمل في الخلفية. ويمكن أن يؤدي هذا السلوك إلى إبطاء أداء الذاكرة في بقية النظام من خلال فرض أحداث غير ضرورية لجمع البيانات غير المرغوب فيها. وفي النهاية، يضطر النظام إلى إيقاف عملية تطبيقك لاستعادة الذاكرة. بعد ذلك، عندما يعود المستخدم إلى تطبيقك، يجب إعادة تشغيل عملية التطبيق بالكامل.
للحصول على معلومات حول ممارسات البرمجة التي يمكن أن تقلّل من استخدام تطبيقك للذاكرة، اطّلِع على مقالة إدارة ذاكرة تطبيقك.
نظرة عامة على لقطة لأجزاء من الذاكرة
لالتقاط لقطة لأجزاء من الذاكرة، اختَر مهمة تحليل استخدام الذاكرة (لقطة لأجزاء من الذاكرة) (استخدِم محلّل الأداء: تشغيل 'التطبيق' كقابل للتصحيح (بيانات كاملة)) لالتقاط لقطة لأجزاء من الذاكرة. أثناء تفريغ الذاكرة المخصّصة، قد يزداد حجم ذاكرة Java مؤقتًا. وهذا أمر طبيعي لأنّ لقطة لأجزاء من الذاكرة تحدث في العملية نفسها التي يعمل بها تطبيقك وتتطلّب بعض الذاكرة لجمع البيانات. بعد التقاط لقطة لأجزاء من الذاكرة، سيظهر لك ما يلي:
.
تعرض قائمة الصفوف المعلومات التالية:
- عمليات التخصيص: عدد عمليات التخصيص في الكومة.
حجم الذاكرة الأصلية: إجمالي حجم الذاكرة الأصلية المستخدَمة من خلال نوع العنصر هذا (بالبايت). ستظهر لك الذاكرة هنا لبعض العناصر التي تم تخصيصها في Java لأنّ نظام التشغيل Android يستخدم الذاكرة الأصلية لبعض فئات إطار العمل، مثل
Bitmap.الحجم السطحي: إجمالي مقدار ذاكرة Java التي يستخدمها نوع العنصر هذا (بالبايت).
الحجم المحفوظ: إجمالي حجم الذاكرة المحفوظة بسبب جميع مثيلات هذه الفئة (بالبايت).
استخدِم قائمة "الذاكرة المؤقتة" لفلترة ذاكرات مؤقتة معيّنة:
- ذاكرة التجميع للتطبيق (تلقائي): هي ذاكرة التجميع الأساسية التي يخصّص تطبيقك الذاكرة عليها.
- حزمة ذاكرة الصور: صورة تشغيل النظام، تحتوي على فئات يتم تحميلها مسبقًا أثناء وقت التشغيل. لا يتم نقل عمليات التخصيص هنا أو إزالتها.
- ذاكرة Zygote المؤقتة: هي ذاكرة مؤقتة للنسخ عند الكتابة يتم فيها إنشاء نسخة من عملية التطبيق في نظام Android.
استخدِم القائمة المنسدلة الخاصة بالترتيب لاختيار طريقة ترتيب عمليات التخصيص:
- الترتيب حسب الصف (الإعداد التلقائي): يتم تجميع جميع عمليات التخصيص استنادًا إلى اسم الصف.
- الترتيب حسب الحزمة: يتم تجميع كل عمليات التخصيص استنادًا إلى اسم الحزمة.
استخدِم القائمة المنسدلة الخاصة بالصف لفلترة مجموعات الصفوف:
- جميع الفئات (الإعداد التلقائي): يعرض جميع الفئات، بما في ذلك تلك من المكتبات والبرامج التابعة.
- عرض تسريبات النشاط/الجزء: يعرض الفئات التي تتسبّب في تسريبات الذاكرة.
- عرض فئات المشاريع: يعرض هذا الخيار الفئات التي يحدّدها مشروعك فقط.
انقر على اسم صف لفتح جزء النسخة. يتضمّن كل مثيل مُدرَج ما يلي:
- العمق: هو أقصر عدد من الخطوات من أي جذر لعملية جمع البيانات غير الضرورية إلى العنصر المحدّد.
- الحجم الأصلي: حجم هذه النسخة في الذاكرة الأصلية لا يظهر هذا العمود إلا في الإصدار 7.0 من نظام التشغيل Android والإصدارات الأحدث.
- الحجم المُصغَّر: حجم هذا العنصر في ذاكرة Java.
- الحجم المحفوظ: حجم الذاكرة الذي يشغله هذا العنصر (وفقًا لشجرة العناصر المسيطرة).
انقر على مثيل لعرض تفاصيل المثيل، بما في ذلك الحقول والمراجع. أنواع الحقول والمراجع الشائعة هي الأنواع المنظَّمة
،
والمصفوفات
،
وأنواع البيانات الأساسية
في Java. انقر بزر الماوس الأيمن على حقل أو مرجع للانتقال إلى المثيل أو السطر المرتبط به في رمز المصدر.
- الحقول: تعرض جميع الحقول في هذا المثال.
- المراجع: تعرض كل مرجع إلى العنصر المميّز في علامة التبويب النسخة.
العثور على تسرّبات الذاكرة
للفلترة بسرعة حسب الفئات التي قد تكون مرتبطة بتسرُّب الذاكرة، افتح القائمة المنسدلة الخاصة بالفئة وانقر على عرض عمليات تسرُّب الأنشطة/اللقطات. يعرض استوديو Android الفئات التي يعتقد أنّها تشير إلى تسرُّب الذاكرة في مثيلات Activity وFragment في تطبيقك.
للبحث عن تسربات الذاكرة يدويًا، تصفَّح قوائم الفئات والعناصر للعثور على عناصر ذات حجم محتفظ به كبير. ابحث عن حالات تسرُّب الذاكرة الناتجة عن أي مما يلي:
- مراجع طويلة الأمد إلى
ActivityأوContextيمكن أن تؤدي إلى تسرُّب الرسم البياني لتركيب Compose المستضاف (مثلComposeViewوعناصر Compose الفرعية). - تسريب عناصر الحالة في Jetpack Compose (
MutableState) أو عناصر حاملة للحالة أو تعبيرات lambda التي تتضمّنContext - عدم إزالة المستمعين أو المراقبين في حزمة
onDisposeمنDisposableEffect - فئات داخلية غير ثابتة، مثل
Runnable، يمكنها الاحتفاظ بنسخة منActivity. - ذاكرات التخزين المؤقت التي تحتفظ بالكائنات لفترة أطول من اللازم
عند العثور على تسرُّبات محتملة للذاكرة، استخدِم علامتَي التبويب الحقول والمراجع في تفاصيل العنصر للانتقال إلى العنصر أو سطر الرمز المصدري الذي يهمّك.
تفعيل تسرّبات الذاكرة للاختبار
لتحليل استخدام الذاكرة، عليك الضغط على رمز تطبيقك ومحاولة فرض تسريب الذاكرة. إحدى طرق إحداث تسرُّبات الذاكرة في تطبيقك هي تركه يعمل لبعض الوقت قبل فحص الكومة. قد تتسرّب التسريبات إلى أعلى عمليات التخصيص في الذاكرة المؤقتة. ومع ذلك، كلما كان التسريب أصغر، زادت المدة التي تحتاجها لتشغيل التطبيق من أجل رصد التسريب.
يمكنك أيضًا بدء تسريب الذاكرة بإحدى الطرق التالية:
- دوِّر الجهاز من الوضع العمودي إلى الوضع الأفقي والعكس عدة مرات
أثناء استخدام حالات نشاط مختلفة. يمكن أن يؤدي تدوير الجهاز غالبًا إلى تسرُّب تطبيق
Activity(وبالتالي شجرة واجهة المستخدم المستندة إلى Compose المستضافة وأشجار الحالة المرتبطة بها) إذا كان تطبيقك يتضمّن مرجعًا إلىActivityأوContextداخل العمليات غير المتزامنة أو عناصر الاحتفاظ بالحالة. - التبديل بين تطبيقك وتطبيق آخر أثناء تواجدهما في حالات نشاط مختلفة على سبيل المثال، انتقِل إلى الشاشة الرئيسية، ثم ارجع إلى تطبيقك.
تصدير لقطة لأجزاء من الذاكرة واستيرادها
يمكنك تصدير واستيراد ملف لقطة لأجزاء من الذاكرة من علامة التبويب التسجيلات السابقة في أداة Profiler. يحفظ "استوديو 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