استخدام الذاكرة (ذاكرة RSS المجهولة + مساحة الإبدال) هو مقياس في "مؤشرات Android الحيوية" يعكس استخدام تطبيقك للذاكرة.
الذاكرة المجهولة هي الذاكرة التي لا يتم الاحتفاظ بنسخة احتياطية منها في ملف على مساحة التخزين، مثل عمليات تخصيص الذاكرة المجمّعة والذاكرة المخصّصة باستخدام mmap. تسجّل هذه الأداة عمليات تخصيص الذاكرة الديناميكية في تطبيقك، بما في ذلك مساحة التخزين المؤقت في Java أو Kotlin، وعمليات تخصيص مساحة التخزين المؤقت الأصلية غير المُدارة (حيث يتم تخزين بيانات بكسل Bitmap على الإصدار 8.0 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 26) والإصدارات الأحدث)، ومكدّسات تنفيذ سلاسل التعليمات. في حين يمكن لنظام التشغيل حذف الذاكرة المستندة إلى الملفات عند الحاجة، لا يمكنه حذف الذاكرة المجهولة.
حجم مجموعة المقيمين (RSS) هو إجمالي عدد صفحات الذاكرة (المشترَكة وغير المشترَكة) التي تستخدمها عملية ما والمخزَّنة في ذاكرة الوصول العشوائي (RAM) الفعلية. تُعد الصفحة "مشترَكة" إذا تم الوصول إليها من خلال أكثر من عملية واحدة (مثل التطبيقات التي تصل إلى المكتبة نفسها).
بالنسبة إلى الذاكرة بدون الكشف عن الهوية، يمكن للنظام كتابة الصفحات إلى مساحة التبديل (أو zRAM على Android) عندما تكون الذاكرة تحت الضغط. يمكن للنظام إعادة قراءة هذه الصفحات من مساحة التبديل إذا لزم الأمر.
بشكل عام، يشير استخدام الذاكرة (ذاكرة RSS المجهولة + مساحة الإبدال) إلى إجمالي عدد صفحات الذاكرة التي لا يتم الاحتفاظ بنسخة احتياطية منها في ملف على مساحة التخزين، بما في ذلك أي ذاكرة يحتفظ بها النظام أيضًا في مساحة الإبدال. يضمن تتبُّع RSS المجهول الهوية + swap أن ترى استهلاك الذاكرة الفعلي وغير القابل للإزالة لتطبيقك.
إذا كان استخدام تطبيقك للذاكرة مرتفعًا، عليك إجراء المزيد من التحقيقات وحلّ المشكلة باستخدام الإرشادات الواردة في هذه الصفحة.
تحديد الاستخدام العالي للذاكرة
مؤشرات Android الحيوية
تشارك "مؤشرات Android الحيوية" بيانات استخدام تطبيقك للذاكرة مقسّمة حسب حالات العمليات التالية:
- التطبيق في المقدّمة: تكون عملية التطبيق مرئية. غالبًا ما يؤثّر ارتفاع قيمة P99 هنا في الأداء الذي يلاحظه المستخدم (مثل حدوث إيقاف مؤقت لعرض واجهة المستخدم أو أعطال بسبب خطأ نفاد الذاكرة)، ويرجع ذلك بشكل كبير إلى الاحتفاظ بمكوّنات واجهة المستخدم أو الأنشطة التي لم يعُد هناك حاجة إليها.
- الخدمة المرئية: تعمل عملية التطبيق في حالة مرئية. ويشمل ذلك الخدمات التي تعمل في المقدّمة والمهام السريعة ومهام نقل البيانات التي يبدؤها المستخدم. ويمكن أن يشمل ذلك أيضًا الخدمات المرتبطة بالنظام أو الخدمات المرتبطة بتطبيقات أخرى. وبما أنّ هذه الخدمات مصمَّمة لتنفيذ مهام تستغرق وقتًا طويلاً، فإنّ الاحتفاظ بالذاكرة بسبب تسرّبها أو عدم تحرير الموارد يمكن أن يؤدي إلى زيادة في معدّل P99 بمرور الوقت.
- في الخلفية: يشغّل التطبيق خدمة تُشغَّل في الخلفية أو تم تصغيره مؤخرًا إلى الخلفية، ولكن لم يتم تخزينه مؤقتًا بعد. وهنا يمكن أن تتراكم المشاكل المتعلقة بتسرُّب عمليات المعالجة في الخلفية والموارد التي لم يتم تحريرها. وبما أنّ حالة العملية هذه أقل أهمية من العمليات المرئية أو التي تعمل في المقدّمة، حاوِل تجنُّب الاحتفاظ بكميات كبيرة من الذاكرة في هذه الحالة.
- مخزَّن مؤقتًا: يكون التطبيق في حالة مخزَّنة مؤقتًا. تتأثر هذه الحالة بشكل كبير بضغط ذاكرة النظام، مثل عمليات LMK. وبما أنّ نظام التشغيل يمكنه إيقاف هذه العملية في أي وقت، يتم توفير هذه الحالة لأغراض تصحيح الأخطاء فقط.
لفهم كيفية ارتباط حالات العملية هذه بعمليات الاسترجاع onTrimMemory،
راجِع الإرشادات حول تحرير الذاكرة استجابةً للأحداث.
تُقسّم "مؤشرات Android الحيوية" أيضًا استخدام تطبيقك للذاكرة حسب مجموعات ذاكرة الوصول العشوائي. يتم عرض مقياس استخدام الذاكرة كمخطط زمني لقيم النسبة المئوية اليومية، إلى جانب أحدث قيمة يومية للنسبتين المئويتين 50 و90.
بعد تحديد الحد الأساسي لاستخدام الذاكرة، اتّبِع الإرشادات لتشخيص الاستخدام المفرط للذاكرة وتحسينه.
تحديد تسربات الذاكرة باستخدام الانحراف الطرفي
للمساعدة في تحديد تسربات الذاكرة، ابحث عن اختلاف بين المستخدمين العاديين (P50) والمستخدمين في نهاية الذيل (P90) في "مؤشرات Android الحيوية". في حين أنّ تضخّم مواد العرض العامة يؤدي إلى زيادة الذاكرة بشكل موحّد في جميع النسب المئوية، تتراكم تسريبات الذاكرة بمرور الوقت، ما يؤدي إلى تحريف كبير في البيانات في الجزء الأخير.
يجب مقارنة مقياسَي P90 وP99 بمقياس P50 الأساسي حسب اسم العملية. إذا تجاوزت نسبة P90 إلى P50 مقدار 3.5 مرة، يشير ذلك إلى احتمال حدوث تسرُّب للذاكرة أثناء الجلسات المطوّلة. في بعض حالات الاستخدام، لا يشير ارتفاع النسبة دائمًا إلى حدوث تسرُّب، ولكن عليك تقييم سير العمل المحدّد لتحديد ما إذا كان ارتفاع استخدام الذاكرة سلوكًا متوقعًا.
الموارد
تشخيص الاستخدام المفرط للذاكرة محليًا
لبدء تشخيص مصدر استخدام الذاكرة المفرط، يمكنك التقاط لقطة لأجزاء من الذاكرة باستخدام تسجيل تفريغ الذاكرة المؤقتة في إعدادات المطوّرين أو استوديو Android أو Perfetto. ننصحك بالبدء بتسجيل لقطة لأجزاء من الذاكرة محليًا بعد اختبار تجربة المستخدم الأساسية في تطبيقك.
ننصحك بشكل خاص باختبار مسارات المستخدمين التالية:
- مكوّنات Webview وجلسات المتصفّح داخل التطبيق
- التمرير اللا نهائي الذي يتضمّن الكثير من الوسائط
- مسارات إنشاء مواد العرض وتعديلها
للتحقّق من احتمال حدوث تسرُّب للذاكرة، عليك أولاً تحديد العمليات التي تستهلك أكبر قدر من الذاكرة باستخدام جدول اسم العملية في لوحة بيانات استخدام الذاكرة في "مؤشرات Android الحيوية". بعد ذلك، شغِّل رحلات المستخدمين ذات الصلة محليًا واجمع عمليات تفريغ الذاكرة المؤقتة في حالات العمليات المختلفة (مرئية، وخدمة تعمل في المقدّمة، ومخزّنة مؤقتًا) للتحقّق مما إذا كان التطبيق يحرّر الذاكرة بعد تشغيله في الخلفية.
إذا كنت بصدد تصحيح أخطاء الذاكرة باستخدام أداة Profiler في "استوديو Android"، يمكنك أيضًا استخدام عملية الدمج مع LeakCanary لتبسيط عملية رصد تسرُّب الذاكرة وتكرار الصور النقطية من أجل تحسين استخدام الصور.
بعد جمع لقطة لأجزاء من الذاكرة، ننصحك باستخدام مهارات Perfetto AI لتحليل لقطة لأجزاء من الذاكرة وتحديد المصادر المحتملة لاستخدام الذاكرة العالي.
في ما يلي مثال على الرد الذي يمكن أن تقدّمه مهارات الذكاء الاصطناعي:
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 للحصول على تفاصيل سريعة عن استخدام تطبيقك للذاكرة على أحد الأجهزة.
- التحليل المستنِد إلى الذكاء الاصطناعي: يمكنك الاستفادة من مهارات الذكاء الاصطناعي في Perfetto لإجراء تحليل مستنِد إلى نماذج اللغات الكبيرة للمساعدة في رصد تسريبات الذاكرة وعمليات التخصيص المفرطة في عمليات التتبُّع.
- التحليل المستند إلى SQL: استخدِم مهارات تحليل التتبُّع وPerfetto SQL لتنفيذ استعلامات مركَّبة ونصوص برمجية متخصّصة لتحليل بيانات التتبُّع المعقّدة.
تحسين استخدام الذاكرة
راجِع الأقسام التالية لمعرفة المزيد حول تحسين استخدام تطبيقك للذاكرة:
- تقليل حجم الرموز والموارد في تطبيقك
- مراقبة الذاكرة المتوفّرة واستخدام الذاكرة
- استخدام بنى رموز برمجية أكثر فعالية من حيث استخدام الذاكرة
للحصول على إرشادات تفصيلية حول حلّ مشاكل الذاكرة، راجِع دليل إدارة ذاكرة تطبيقك.