استخدام الذاكرة (ذاكرة RSS المجهولة + مساحة الإبدال)

استخدام الذاكرة (ذاكرة RSS المجهولة + مساحة الإبدال) هو مقياس في مؤشرات Android الحيوية يعكس استخدام تطبيقك للذاكرة.

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

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

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

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

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

تحديد حالات استخدام الذاكرة بشكل كبير

مؤشرات Android الحيوية

تشارك مؤشرات Android الحيوية استخدام تطبيقك للذاكرة مقسّمًا حسب حالات العملية التالية: حالات العملية:

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

لفهم كيفية ارتباط حالات العملية هذه بعمليات معاودة الاتصال onTrimMemory، يُرجى الرجوع إلى الإرشادات المتعلّقة بـ تحرير الذاكرة استجابةً للأحداث.

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

بعد تحديد خط الأساس للذاكرة، اتّبِع الإرشادات لـ تشخيص استخدام الذاكرة المفرط وتحسينه.

تحديد تسرّبات الذاكرة باستخدام الانحراف في الذيل

للمساعدة في تحديد تسرّبات الذاكرة، ابحث عن اختلاف بين المستخدمين العاديين (P50) والمستخدمين في الذيل (P90) في مؤشرات Android الحيوية. في حين أنّ زيادة حجم مواد العرض بشكل عام تؤدي إلى زيادة الذاكرة بشكل موحّد على مستوى جميع النسب المئوية، تتفاقم تسرّبات الذاكرة بمرور الوقت، ما يؤدي إلى انحراف كبير في بيانات الذيل.

عليك مقارنة مقياسَي P90 وP99 بخط الأساس P50 حسب اسم العملية. إذا تجاوزت نسبة P90 إلى P50 ‏3.5، يشير ذلك إلى تسرّب محتمل للذاكرة أثناء الجلسات الطويلة. في حالات استخدام معيّنة، لا تشير النسبة المرتفعة دائمًا إلى تسرّب، ولكن عليك تقييم سير العمل المحدّد لتحديد ما إذا كان استخدام الذاكرة المرتفع سلوكًا متوقعًا.

الموارد

تشخيص حالات الاستخدام المفرط للذاكرة محليًا

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

ننصحك بشكل خاص باختبار رحلات المستخدم التالية:

  • عناصر WebView وجلسات المتصفّح داخل التطبيق
  • التمرير اللانهائي الذي يتضمّن وسائط كثيرة
  • عمليات إنشاء مواد العرض وتعديلها

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

إذا كنت بصدد تصحيح أخطاء الذاكرة باستخدام أداة Android Studio Profiler، يمكنك أيضًا استخدام عملية التكامل مع LeakCanary لتبسيط عملية رصد التسرّبات والصور النقطية المكرّرة من أجل تحسين استخدام الصور.

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

في ما يلي مثال على الردّ الذي يمكن أن تقدّمه مهارات الذكاء الاصطناعي:

I have completed the analysis of memory leaks and bitmap issues for [app] using the provided Perfetto trace.
  Summary of Findings
  The investigation identified a critical memory pressure issue caused by massive bitmap retention within the app process.
...
Recommendations for [app]
   1. [Library] Image Cache Optimization:
       * Review the [Library] caching strategy. Ensure that bitmaps
         loaded for animations are released or downsampled when the animation is
         not in the foreground.
   2. Asset Resolution Audit:
       * The 14.7 MB average size suggests full-screen or extremely high-density assets. Audit the [library] files in the native_home component to ensure they are not using unnecessarily large source images.
   3. View Lifecycle Management:
       * Investigate why 21 [LibraryImage] instances are alive simultaneously. Ensure that views in the bottom
      tab are properly detached or their animations are cleared when switching between tabs.
   4. Fix Surface Leaks:
       * Address the Surface.release failures observed in the logs, as these can lead to both memory leaks and
         native resource exhaustion.

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

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

  • التحليل اليدوي: استخدِم إرشادات Perfetto Heap Dump Explorer للتعرّف على كيفية التنقّل في تصوّرات لقطات أجزاء من الذاكرة وتفسيرها في واجهة مستخدم Perfetto.
  • تخصيصات Java/Kotlin: اقرأ عرض أول لقطة لجزء من الذاكرة في ART خطوة بخطوة للتعرّف على كيفية تحليل لقطات أجزاء من الذاكرة في وقت تشغيل Android‏ (ART).
  • التخصيصات الأصلية: يُرجى الرجوع إلى مستندات Perfetto Native Profiling للتعرّف على كيفية جمع وتحليل ملفات تحديد مواصفات الذاكرة الأصلية (C/C++).
  • الفحص باستخدام واجهة سطر الأوامر: استخدِم الأمر adb dumpsys meminfo للحصول على تقسيم سريع لاستخدام تطبيقك للذاكرة على أحد الأجهزة.

تحسين استخدام الذاكرة

يُرجى الرجوع إلى هذه الأقسام للتعرّف على مزيد من المعلومات حول تحسين استخدام تطبيقك للذاكرة:

للحصول على إرشادات مفصّلة حول حلّ مشاكل الذاكرة، يُرجى الرجوع إلى دليل إدارة ذاكرة تطبيقك.