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

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

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

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

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

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

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

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

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

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

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

نظرة عامة على "أداة تحليل الذاكرة"

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

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

كما هو موضح في الشكل 1، تشتمل طريقة العرض الافتراضية لأداة تحليل الذاكرة على التالي:

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

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

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

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

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

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

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

تستند الأرقام التي تظهر في أعلى "أداة تحليل الذاكرة" (الشكل 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 أو إصدار أقدم، تتم عملية التخصيص هذه لا يبدأ احتساب عدد المهام إلا في وقت اتصال "أداة تحليل الذاكرة" قيد التشغيل. لذلك فإن أي كائنات مخصصة قبل البدء في إنشاء الملفات التعريفية ليست . ومع ذلك، يشتمل الإصدار Android 8.0 والإصدارات الأحدث على حزمة تتبع جميع التخصيصات، وبالتالي يكون هذا العدد دائمًا العدد الإجمالي لكائنات Java المعلّقة في تطبيقك على الإصدار 8.0 من Android أو إصدار أحدث.

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

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

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

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

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

العرض المرئي لتخصيصات Java في أداة تحليل الذاكرة

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

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

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

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

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

يمكنك استخدام القائمتين أعلى قائمة الكائنات المخصصة لاختيار لأجزاء من الذاكرة للتحقق منها وكيفية تنظيم البيانات.

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

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

من القائمة على يسار الشاشة، اختَر طريقة ترتيب عمليات التخصيص:

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

تحسين أداء التطبيق أثناء إنشاء الملفات التعريفية

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

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

عرض مراجع JNI العالمية

Java Native Interface (JNI) هو إطار عمل يسمح برموز JavaScript البرمجية والعناصر الأصلية التعليمات البرمجية لاستدعاء بعضهم البعض.

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

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

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

الشكل 4. عرض المراجع العالمية لـ JNI

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

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

محلّل الذاكرة الأصلي

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

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

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

محلّل الذاكرة الأصلي

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

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

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

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

لتغيير حجم عيّنة "برنامج تحليل الذاكرة الأصلية":

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

تسجيل لقطة لأجزاء من الذاكرة

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

بعد تسجيل لقطة لأجزاء من الذاكرة، يمكنك الاطّلاع على ما يلي:

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

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

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

الشكل 5. جارٍ عرض لقطة لأجزاء من الذاكرة.

إذا كنت بحاجة إلى مزيد من الدقة في تحديد وقت إنشاء الخلاصة، يمكنك إنشاء لقطة لأجزاء من الذاكرة في نقطة حرجة في رمز التطبيق عن طريق dumpHprofData()

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

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

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

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

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

يمكنك استخدام القائمتين أعلى قائمة الكائنات المخصصة لاختيار للقطات لأجزاء من الذاكرة لفحصها وكيفية تنظيمها.

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

  • كومة الذاكرة المؤقتة: عندما لا يحدِّد النظام أي لقطة شاشة.
  • كومة الذاكرة المؤقتة في التطبيقات: هي إحدى اللحظات الأساسية التي يخصِّص تطبيقك الذاكرة فيها.
  • كومة الصور: صورة تشغيل النظام التي تحتوي على الفئات تم تحميله مسبقًا أثناء وقت التشغيل. نضمن ألا تنتقل التخصيصات هنا أبدًا أو تختفي.
  • كومة الذاكرة المؤقتة: كومة النسخ عند الكتابة التي يتم فيها بدء عملية التطبيق في نظام 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 Studio 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 إطار العمل.