تسجيل تخصيصات Java أو Kotlin

يساعدك تسجيل عمليات تخصيص Java/Kotlin في تحديد أنماط الذاكرة غير المرغوب فيها التي قد تتسبّب في حدوث مشاكل في الأداء. يمكن أن يعرض لك أداة تحليل الأداء ما يلي حول عمليات تخصيص الكائنات:

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

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

كيفية تسجيل عمليات التخصيص في Java/Kotlin

لتسجيل عمليات تخصيص Java/Kotlin، اختَر مهمة تتبُّع استهلاك الذاكرة (عمليات تخصيص Java/Kotlin) من علامة التبويب الصفحة الرئيسية في أداة إنشاء الملفات الشخصية. يُرجى العِلم أنّه يجب توفُّر تطبيق قابل للتصحيح (استخدِم Profiler: run 'app' as debuggable (complete data)) لتسجيل عمليات تخصيص Java/Kotlin.

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

لفرض حدث جمع البيانات غير الضرورية أثناء التسجيل، انقر على رمز سلة المهملات .

نظرة عامة على عمليات تخصيص Java/Kotlin

بعد إيقاف التسجيل، سيظهر لك ما يلي:

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

  • استخدِم القائمة المنسدلة "كومة" لفلترة أكوام معيّنة. بالإضافة إلى الفلاتر المتاحة عند تسجيل تفريغ الذاكرة المؤقتة، يمكنك الفلترة حسب الفئات في الذاكرة المؤقتة JNI، وهي الذاكرة المؤقتة التي تعرض مكان تخصيص مراجع Java Native Interface (JNI) وإصدارها.

  • استخدِم القائمة المنسدلة الخاصة بالترتيب لاختيار طريقة ترتيب عمليات التخصيص. بالإضافة إلى الترتيبات المتاحة عند تسجيل تفريغ الذاكرة المؤقتة، يمكنك الترتيب حسب سلسلة استدعاء الدوال البرمجية.

كيفية احتساب الذاكرة

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

  • Java: الذاكرة من العناصر التي تم تخصيصها من رمز Java أو Kotlin
  • الذاكرة الأصلية: الذاكرة من الكائنات التي تم تخصيصها من رمز C أو C++.

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

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

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

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

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

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

فحص سجلّ التخصيص

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

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

انقر بزر الماوس الأيمن على أي إدخال في القائمة للانتقال إلى رمز المصدر ذي الصلة.

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

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

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

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

تعرض علامة التبويب حزمة استدعاء التخصيص الأماكن التي يتم فيها تخصيص مراجع JNI وإصدارها في الرمز البرمجي.

لمزيد من المعلومات حول JNI، يمكنك الاطّلاع على نصائح حول JNI.