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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

الموارد

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

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

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

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

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

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

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

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

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++).
  • الفحص باستخدام واجهة سطر الأوامر (CLI): استخدِم الأمر adb dumpsys meminfo للحصول على تقسيم سريع لاستخدام تطبيقك للذاكرة على أحد الأجهزة.
  • التحليل بمساعدة الذكاء الاصطناعي: استخدِم مهارات الذكاء الاصطناعي في Perfetto لتشغيل تحليل مستند إلى نماذج لغوية كبيرة (LLM) للمساعدة في رصد تسرّبات الذاكرة وعمليات تخصيص الذاكرة بشكل كبير في عمليات التتبُّع.
  • التحليل المستند إلى SQL: استخدِم مهارات Perfetto SQL وTrace Analysis Skills لتشغيل طلبات بحث منظَّمة ونصوص برمجية متخصّصة لتحليل بيانات التتبُّع المعقّدة.

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

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

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