التطبيقات التي تستهلك ذاكرة الجهاز

يراقب برنامج daemon لآلية إنهاء العمليات عند انخفاض الذاكرة (LMK) في Android حالة الذاكرة في نظام Android قيد التشغيل ويستجيب للضغط العالي على الذاكرة من خلال إنهاء العمليات الأقل أهمية. تتتبّع "مؤشرات Android الحيوية" حالات إنهاء التطبيقات بسبب نقص الذاكرة التي يلاحظها المستخدمون، وتُبلغ عنها في Google Play Console لمساعدتك في تحديد مشاكل ضغط الذاكرة التي تؤثر في تجربة المستخدمين.

مقياس LMK في "مؤشرات Android الحيوية"

يمكن أن تساعدك "مؤشرات Android الحيوية" في مراقبة معدّل إنهاء العمليات بسبب نقص الذاكرة في تطبيقك وتحسينه. تقيس مؤشرات Android الحيوية نسبة واحدة فقط من أعطال LMK، وهي نسبة أعطال LMK التي لاحظها المستخدمون.

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

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

يمكنك العثور على المقياس ضمن قسم الثبات في "مؤشرات Android الحيوية":

الشكل 1: الوصول إلى نسبة أعطال LMK التي لاحظها المستخدمون في "مؤشرات Android الحيوية"

كما هو الحال مع مؤشرات الأداء الأساسية المماثلة، مثل أخطاء ANR والأعطال، يمكنك فلترة المقاييس أو مقارنتها مع مقاييس التطبيقات المشابهة أو تتبُّع تغيُّرها لفترة زمنية طويلة (تصل إلى 3 سنوات). تتوفّر البيانات للتطبيقات الحالية اعتبارًا من 28 يناير 2025.

الشكل 2. نظرة عامة على نسبة أعطال LMK في "مؤشرات Android الحيوية"

طريقة عمل برنامج daemon لإيقاف العمليات عند انخفاض الذاكرة

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

لتحديد العملية التي يجب إنهاؤها عند انخفاض الذاكرة الخالية، يستخدم برنامج daemon لآلية إنهاء العمليات عند انخفاض الذاكرة (LMK) نتيجة نفاد الذاكرة تُسمى oom_adj_score لتحديد أولوية العمليات الجارية. ويتم إنهاء العمليات التي تحصل على نتيجة عالية أولاً. يتم إنهاء التطبيقات التي تعمل في الخلفية أولاً، ثم عمليات النظام. يسرد الجدول التالي فئات تقييم LMK من الأعلى إلى الأدنى. يتم إنهاء العناصر في الفئة الأعلى نتيجة، في الصف الأول، أولاً:

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

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

يمكن أن تساعدك الأدوات التالية في العثور على مشاكل الذاكرة وتشخيصها بالطرق التالية:

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

إذا كانت لعبتك تعمل على محرّك أصلي، استخدِم HWAddress Sanitizer لتصحيح أخطاء تخصيص الذاكرة الأصلية.

محلّل الذاكرة في "استوديو Android"

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

محلّل الذاكرة في "استوديو Android" يعرض مراجع JNI العامة في الذاكرة الديناميكية
الشكل 4. عرض مراجع JNI العامة في "محلّل الذاكرة" في "استوديو Android"

أدوات تحليل استخدام الذاكرة في Unity

إذا كنت تستخدم محرّك Unity لإنشاء تطبيقاتك، يمكنك اتّباع إرشادات تحليل الذاكرة في Unity. توفّر Unity أداتَين لتحليل استخدام الذاكرة في تطبيقك على Unity.

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

تعرض وحدة الذاكرة عمليات تخصيص الذاكرة، مثل ذاكرة الزخرفة وذاكرة الشبكة.
الشكل 5. نافذة Unity Profiler مع اختيار وحدة الذاكرة

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

نافذة Unity محلّل الذاكرة تعرض تفاصيل لقطة الذاكرة
الشكل 6. تحليل لقطة للذاكرة باستخدام نافذة "محلّل الذاكرة"

للاطّلاع على سير عمل Unity الخاص بنظام التشغيل Android، يُرجى مراجعة التحقّق من استخدام الذاكرة باستخدام أدوات Unity، وتحسين استخدام الذاكرة في Unity، وتصحيح أخطاء LMK في ألعاب Unity.

Unreal Memory Insights

يمكن للتطبيقات التي تم إنشاؤها باستخدام Unreal Engine استخدام Unreal Memory Insights للاطّلاع على معلومات تفصيلية حول تخصيص الذاكرة وإلغاء تخصيصها، بما في ذلك علامات Low Level Memory (LLM)‎ ومجموعات استدعاء الدوال المرتبطة بأجزاء الذاكرة.

يمكن لنظام طلبات البحث في Memory Insights العثور على عمليات التخصيص النشطة في أي وقت، وتحديد التغييرات في استخدام الذاكرة، وتحديد حالات تسرُّب الذاكرة، والتمييز بين عمليات التخصيص القصيرة الأجل والطويلة الأجل.

بدءًا من الإصدار 5.4 من Unreal Engine، تتيح أداة Memory Insights تتبُّع الذاكرة باستخدام تسلسلات استدعاء الدوال لمشاريع Android.

أداة تتبُّع Memory Insights تعرض الرسم البياني الرئيسي للذاكرة وعدد عمليات التخصيص المباشرة وعدد أحداث التخصيص/الإخلاء.
الشكل 7. أداة تتبُّع Memory Insights من Unreal

للاطّلاع على سير عمل Unreal الخاص بنظام Android، يُرجى مراجعة التحقّق من استخدام الذاكرة في Unreal وتحسين استخدام الذاكرة في Unreal.

إحصاءات حول انخفاض سعة الذاكرة

يوفّر Android عمليات استدعاء وواجهات برمجة تطبيقات تتيح لك تقليل استخدام الذاكرة في لعبتك وتحديد سبب إنهاء عمليات تشغيل اللعبة السابقة.

عمليات الاسترداد

لا تسجِّل عمليات استدعاء trim المتوقفة نهائيًا. لا يوفّر Android واجهات برمجة تطبيقات لرصد أحداث الضغط على الذاكرة الأصلية قبل أن يستعيد النظام الذاكرة، ولم تكن عمليات الاستدعاء الدقيقة لتقليص الذاكرة قيد التشغيل (TRIM_MEMORY_RUNNING_*) فعّالة في منع عمليات الإنهاء بسبب انخفاض الذاكرة. نتيجةً لذلك، أوقف Android نهائيًا جميع مستويات الاقتطاع باستثناء TRIM_MEMORY_UI_HIDDEN وTRIM_MEMORY_BACKGROUND. استخدِم دوال ردّ الاتصال المتبقية هذه، أو ما يعادلها من مراحل نشاط المحرّك، مثل OnApplicationPause في Unity وApplicationWillEnterBackgroundDelegate في Unreal، لإصدار واجهة المستخدم والموارد المساعدة عندما تنتقل لعبتك إلى الخلفية. لمعرفة تفاصيل التنفيذ، يُرجى الاطّلاع على مقالة تقليل استخدام الذاكرة في الألعاب.

إنهاء اللعبة

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

في ما يلي معلومات وإحصاءات وأفضل الممارسات لمساعدتك في تحسين استخدام الذاكرة في الألعاب:

  • استخدام واجهة برمجة التطبيقات ApplicationExitInfo: تعرض هذه الواجهة سبب إيقاف نظام Android لتشغيل اللعبة السابقة. استخدِم ApplicationExitInfo للتحقّق من انخفاض الذاكرة (REASON_LOW_MEMORY) أو عمليات إنهاء محدّد الذاكرة (REASON_MEMORY_LIMITER) كسبب للخروج من عملية سابقة (راجِع ApplicationExitInfo للألعاب). تحقَّق مما إذا تم إنهاء اللعبة بسبب الضغط على الذاكرة، حتى يمكن تحسين اللعبة لاستخدام ذاكرة أقل على هذا الجهاز.
  • الاطّلاع على إجمالي ذاكرة الوصول العشوائي (RAM) الفعلية: لمنع إيقاف الألعاب عندما تكون في المقدّمة ولمطابقة إمكانات الجهاز، اطّلِع على إجمالي ذاكرة الوصول العشوائي (RAM) الفعلية لكل جهاز للحصول على دقة عالية لضبط استخدام ذاكرة اللعبة بناءً على ذلك. إذا كان الهدف هو منع إيقاف التطبيقات بعد فترة قصيرة من نقلها إلى الخلفية (للسماح للاعب بتنفيذ مهام متعددة)، استخدِم عمليات الاستدعاء trim (TRIM_MEMORY_UI_HIDDEN تحديدًا) لتقليل استخدام ذاكرة اللعبة.

مراجع إضافية