قاتلان حافظه کم

برنامه پس‌زمینه بستن ناشی از کمبود حافظه (LMK) Android وضعیت حافظه سیستم Android درحال اجرا را پایش می‌کند و با پایان دادن به کم‌اهمیت‌ترین فرایندها، به فشار زیاد روی حافظه واکنش نشان می‌دهد. «معیارهای کلیدی Android» توقف‌های LMK درک‌شده توسط کاربر را در «کنسول Google Play» ردگیری و گزارش می‌کند تا به شما کمک کند مشکلات فشار حافظه را که بر کاربران شما تأثیر می‌گذارد شناسایی کنید.

سنجه «بستن ناشی از کمبود حافظه» در «معیارهای کلیدی Android»

«معیارهای کلیدی Android» می‌تواند به شما کمک کند بر نرخ LMK برنامه‌تان نظارت داشته باشید و آن را بهبود دهید. «معیارهای کلیدی Android» فقط یک نرخ LMK را اندازه‌گیری می‌کند: نرخ LMK دیده‌شده توسط کاربر.

این سنجه نشان‌دهنده درصد کاربران فعال روزانه شما است که حداقل یک «بستن ناشی از کمبود حافظه» (LMK) دیده‌شده توسط کاربر را تجربه کرده‌اند. «بستن ناشی از کمبود حافظه» دیده‌شده توسط کاربر نوعی «بستن ناشی از کمبود حافظه» است که احتمالاً کاربر متوجه آن شده است. برای مثال، این سنجه شامل موارد «بستن ناشی از کمبود حافظه» است که وقتی برنامه‌تان فعالیتی را نمایش می‌دهد یا به‌عنوان سرویس پیش‌زمینه‌ای اجرا می‌شود رخ می‌دهد. این پایان‌ها منجر به خروج فوری و غیرعادی از فرایند می‌شود. از دید کاربر نهایی، به‌نظر می‌رسد برنامه ازکار افتاده است و اغلب سازوکارهای استاندارد ذخیره وضعیت چرخه حیات را دور می‌زند و منجر به ازدست رفتن پیشرفت کاربر می‌شود.

«معیارهای کلیدی Android» بر این توقف‌های فرایند تمرکز می‌کند زیرا این توقف‌ها به‌عنوان پراکسی با وفاداری بالا برای مشکلات سوءمدیریت حافظه عمل می‌کنند. نرخ LMK بالای ۱٪ نشان‌دهنده نیاز مبرم به اقدام فوری است. اما، نرخ پایین‌تر «بستن ناشی از کمبود حافظه» لزوماً به‌معنای سالم بودن استفاده برنامه از حافظه نیست. این نرخ پایین‌تر ممکن است به این معنی باشد که شبح LMK مکرراً فرایندها را درحالی‌که در پس‌زمینه هستند ازبین می‌برد، که این امر عملکرد «شروع گرم» و روان بودن چندوظیفگی را کاهش می‌دهد.

می‌توانید این سنجه را در بخش پایداری در «معیارهای کلیدی Android» پیدا کنید:

شکل ۱. به نرخ LMK (بستن برنامه به‌دلیل کمبود حافظه) دیده‌شده توسط کاربر در «معیارهای کلیدی Android» دسترسی پیدا کنید.

همانند معیارهای کلیدی اصلی مشابه، مثل ANR و ازکارافتادگی، می‌توانید معیارها را فیلتر کنید، معیارهایتان را با همتایانتان مقایسه کنید، یا تغییر معیار را برای مدت طولانی (تا ۳ سال) پایش کنید. داده‌ها برای برنامه‌های موجود از ۲۸ ژانویه ۲۰۲۵ دردسترس است.

شکل ۲. نمای کلی نرخ «بستن ناشی از کمبود حافظه» در «معیارهای کلیدی Android».

نحوه عملکرد دیمن بستن برنامه ناشی از کمبود حافظه

پلاتفرم Android براساس این فرض اجرا می‌شود که حافظه آزاد حافظه هدررفته است. Android سعی می‌کند همیشه از همه حافظه دردسترس استفاده کند. برای مثال، سیستم برنامه‌ها را پس‌از بسته شدن در حافظه نگه می‌دارد تا کاربر بتواند به‌سرعت به آن‌ها برگردد. به همین دلیل، دستگاه‌های Android اغلب با حافظه آزاد بسیار کمی کار می‌کنند (تخصیص حافظه بین فرایندها را ببینید).

برای تصمیم‌گیری درباره اینکه وقتی حافظه آزاد کم است کدام فرایند بسته شود، برنامه پس‌زمینه بستن ناشی از کمبود حافظه (LMK) از امتیاز کمبود حافظه به‌نام oom_adj_score برای اولویت‌بندی فرایندهای درحال اجرا استفاده می‌کند. فرایندهای دارای امتیاز بالا ابتدا متوقف می‌شوند. برنامه‌های پس‌زمینه ابتدا متوقف می‌شوند؛ فرایندهای سیستم، آخرین مورد هستند. جدول زیر دسته‌های امتیازدهی «بستن ناشی از کمبود حافظه» را از زیاد به کم فهرست می‌کند. موارد موجود در دسته‌ای که بالاترین امتیاز را دارد، در ردیف یک، ابتدا متوقف می‌شوند:

فرایندهای Android از بالاترین امتیاز به پایین‌ترین امتیاز رتبه‌بندی شده‌اند: برنامه‌های پس‌زمینه، برنامه قبلی، برنامه صفحه اصلی،
             سرویس‌ها، برنامه‌های قابل‌درک، برنامه پیش‌زمینه، پایدار، سیستم، و بومی.
شکل ۳. فرایندهای Android، با امتیازهای بالا در بالا و امتیازهای پایین در پایین.

ابزارهای نمایه‌سازی استفاده از حافظه

ابزارهای زیر می‌توانند به شما کمک کنند مشکلات حافظه را به روش‌های زیر پیدا و تشخیص دهید:

  • ببینید برنامه‌تان چگونه درطول زمان حافظه اختصاص می‌دهد. می‌توانید نموداری هم‌زمان از میزان حافظه مورداستفاده برنامه‌تان، تعداد اشیاء Java اختصاص‌داده‌شده، و زمان وقوع جمع‌آوری زباله را مشاهده کنید.
  • رویدادهای جمع‌آوری زباله را آغاز کنید و درحین اجرای برنامه، از پشته جاوا عکس آنی بگیرید.
  • تخصیص‌های حافظه برنامه‌تان را ضبط کنید، همه اشیای تخصیص‌یافته را بازرسی کنید، و رد پشته را برای هر تخصیص مشاهده کنید.

اگر بازی‌تان روی موتور بومی اجرا می‌شود، از HWAddress Sanitizer برای اشکال‌زدایی تخصیص حافظه بومی استفاده کنید.

تحلیل‌گر حافظه «استودیو Android»

«استودیو Android» تحلیل‌گر حافظه را به‌عنوان مؤلفه‌ای از تحلیل‌گر Android ارائه می‌دهد که به شما کمک می‌کند نشت حافظه و ریزش حافظه را که می‌تواند منجر به لکنت، توقف، و حتی ازکارافتادن برنامه شود شناسایی کنید. نمایه‌ساز نموداری هم‌زمان از مصرف حافظه برنامه‌تان نشان می‌دهد و به شما امکان می‌دهد رونوشت پشته بگیرید، جمع‌آوری زباله را اجباری کنید، و تخصیص حافظه را ردیابی کنید.

«تحلیل‌گر حافظه استودیو Android» که ارجاع‌های JNI سراسری را در توده نشان می‌دهد.
شکل ۴. مشاهده ارجاع‌های JNI سراسری در «تحلیل‌گر حافظه استودیو Android».

ابزارهای نمایه‌سازی حافظه Unity

اگر از Unity Engine برای ساختن برنامه‌هایتان استفاده می‌کنید، می‌توانید راهنمای نمایه‌سازی حافظه Unity را دنبال کنید. Unity دو ابزار برای تجزیه‌وتحلیل استفاده از حافظه در برنامه‌تان در Unity ارائه می‌دهد.

اولی واحد Memory Profiler است که یک نمایه‌ساز داخلی است و اطلاعات پایه‌ای درباره اینکه برنامه‌تان کجا از حافظه استفاده می‌کند به شما می‌دهد.

واحد حافظه تخصیص‌های حافظه مانند حافظه بافت و حافظه مش را نشان می‌دهد.
شکل ۵. پنجره Unity Profiler با ماژول Memory انتخاب‌شده.

ابزار دوم بسته «تحلیل‌گر حافظه» است که یک بسته Unity است و می‌توانید آن را به پروژه‌تان اضافه کنید. این بسته یک پنجره «تحلیل‌گر حافظه» اضافی به Unity Editor اضافه می‌کند. «تحلیل‌گر حافظه» به شما امکان می‌دهد استفاده از حافظه را در برنامه‌تان با جزئیات بیشتری تحلیل کنید. می‌توانید عکس‌های آنی را ذخیره و مقایسه کنید تا نشت حافظه را پیدا کنید یا چیدمان حافظه را ببینید تا مشکلات تکه‌تکه‌سازی حافظه را پیدا کنید.

پنجره Unity Memory Profiler که تفکیک عکس آنی حافظه را نشان می‌دهد.
شکل ۶. تجزیه‌وتحلیل عکس آنی حافظه بااستفاده از پنجره «تحلیل‌گر حافظه».

برای گردش‌های کاری Unity مختص Android، به بررسی مصرف حافظه با ابزارهای Unity، بهینه‌سازی مصرف حافظه در Unity، و اشکال‌زدایی LMK برای بازی‌های Unity مراجعه کنید.

Unreal Memory Insights

برنامه‌های ساخته‌شده با Unreal Engine می‌توانند از Unreal Memory Insights برای دیدن اطلاعات دقیق درباره تخصیص و لغو تخصیص حافظه، ازجمله برچسب‌های Low Level Memory (LLM) و پشته‌های فراخوانی مرتبط با بلوک‌های حافظه استفاده کنند.

سیستم پُرسمان Memory Insights می‌تواند تخصیص‌های فعال را در هر نقطه‌ای از زمان پیدا کند، تغییرات در استفاده از حافظه را شناسایی کند، نشت حافظه را مکان‌یابی کند، و تخصیص‌های کوتاه‌مدت را از تخصیص‌های بلندمدت متمایز کند.

از UE 5.4،‏ Memory Insights از ردیابی حافظه با پشته‌های فراخوانی برای پروژه‌های Android پشتیبانی می‌کند.

ردیاب «اطلاعات آماری حافظه» که نمودار حافظه اصلی، تعداد تخصیص‌های زنده، و تعداد رویدادهای تخصیص/آزادسازی را نشان می‌دهد.
شکل ۷. ردیاب Unreal's Memory Insights.

برای گردش‌های کاری 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) استفاده کنید تا مصرف حافظه بازی‌تان کاهش یابد.

منابع بیشتر