قاتل های کم حافظه، کشنده های کم حافظه، قاتل های کم حافظه، قاتل های کم حافظه

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

فرآیند دیمنِ قاتل حافظه کم اندروید (LMK) وضعیت حافظه یک سیستم اندروید در حال اجرا را رصد می‌کند و با از بین بردن فرآیندهای کم‌اهمیت‌تر، به فشار بالای حافظه واکنش نشان می‌دهد تا عملکرد سیستم در سطوح قابل قبول حفظ شود.

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

فرآیندهای اندروید از بالاترین امتیاز به پایین‌ترین امتیاز رتبه‌بندی شده‌اند: برنامه‌های پس‌زمینه، برنامه قبلی، برنامه خانگی، سرویس‌ها، برنامه‌های قابل مشاهده، برنامه پیش‌زمینه، مداوم، سیستمی و بومی.
شکل ۱. پردازش‌های اندروید، با امتیازهای بالا در بالا و امتیازهای پایین در پایین.

ابزارهای پروفایلینگ حافظه

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

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

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

پروفایلر حافظه اندروید استودیو

اندروید استودیو ، Memory Profiler را به عنوان بخشی از Android Profiler ارائه می‌دهد که به شما در شناسایی نشت حافظه و از دست دادن حافظه که می‌تواند منجر به وقفه، هنگ کردن و حتی از کار افتادن برنامه شود، کمک می‌کند. این Profiler یک نمودار بلادرنگ از میزان استفاده از حافظه برنامه شما نشان می‌دهد و به شما امکان می‌دهد تا یک heap dump را ضبط کنید، garbage collection را اجباری کنید و تخصیص حافظه را پیگیری کنید.

شکل 2. مشاهده ارجاعات سراسری JNI در پروفایلر حافظه اندروید استودیو.

ابزارهای پروفایلینگ حافظه در یونیتی

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

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

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

ابزار دوم، پکیج Memory Profiler است که یک پکیج Unity است که می‌توانید به پروژه خود اضافه کنید. این پکیج یک پنجره Memory Profiler اضافی به ویرایشگر Unity اضافه می‌کند. Memory Profiler به شما امکان می‌دهد تا میزان استفاده از حافظه را در برنامه خود با جزئیات بیشتری تجزیه و تحلیل کنید. می‌توانید snapshotها را ذخیره و مقایسه کنید تا نشتی حافظه را پیدا کنید یا طرح‌بندی حافظه را ببینید تا مشکلات تکه‌تکه شدن حافظه را پیدا کنید.

شکل ۴. تحلیل یک اسنپ‌شات حافظه با استفاده از پنجره‌ی پروفایل حافظه.

بینش‌های حافظه غیرواقعی

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

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

از نسخه ۵.۴ به بعد، Memory Insights از ردیابی حافظه با استفاده از callstacks برای پروژه‌های اندروید پشتیبانی می‌کند.

ردیاب بینش حافظه که نمودار حافظه اصلی، تعداد تخصیص زنده و تعداد رویدادهای تخصیص/آزاد را نشان می‌دهد.
شکل 5. ردیاب بینش‌های حافظه‌ی آنریل.

بینش‌های کم حافظه

اندروید callbackها و APIهایی را ارائه می‌دهد که به شما امکان می‌دهند نیازهای حافظه بازی خود را کاهش دهید و دلیل خاتمه یافتن اجرای بازی‌های قبلی را تعیین کنید.

تماس‌های برگشتی

برای فراخوانی‌های trim منسوخ‌شده ثبت‌نام نکنید. اندروید هیچ API برای تشخیص رویدادهای فشار بر حافظه‌ی بومی، زمانی که سیستم با محدودیت حافظه مواجه است، ندارد. فراخوانی‌های trim در جلوگیری از killهای ناشی از کمبود حافظه مفید نبوده‌اند، بنابراین اندروید همه‌ی آن‌ها را به جز TRIM_MEMORY_UI_HIDDEN و TRIM_MEMORY_BACKGROUND منسوخ کرده است.

خاتمه بازی

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

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

  • استفاده از ApplicationExitInfo : این API دلیل توقف اجرای قبلی بازی توسط سیستم اندروید را برمی‌گرداند. از ApplicationExitInfo برای بررسی کمبود حافظه به عنوان دلیل توقف اجرای قبلی فرآیند استفاده کنید. بررسی کنید که آیا بازی به دلیل کمبود حافظه متوقف شده است یا خیر، تا بتوان بازی را برای استفاده کمتر از حافظه در آن دستگاه بهینه کرد.
  • به کل رم فیزیکی توجه کنید: برای جلوگیری از بسته شدن بازی‌ها در حالت اجرا و تطبیق آنها با قابلیت‌های دستگاه، به کل رم فیزیکی هر دستگاه توجه کنید تا بتوانید میزان استفاده از حافظه بازی را بر اساس آن تنظیم کنید. اگر هدف جلوگیری از بسته شدن برنامه‌ها بلافاصله پس از انتقال به پس‌زمینه است (برای اینکه به بازیکن اجازه دهید چند کار را همزمان انجام دهد)، از توابع فراخوانی trim (به طور خاص TRIM_MEMORY_UI_HIDDEN ) برای کاهش استفاده از حافظه بازی خود استفاده کنید.

منابع اضافی

،

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

فرآیند دیمنِ قاتل حافظه کم اندروید (LMK) وضعیت حافظه یک سیستم اندروید در حال اجرا را رصد می‌کند و با از بین بردن فرآیندهای کم‌اهمیت‌تر، به فشار بالای حافظه واکنش نشان می‌دهد تا عملکرد سیستم در سطوح قابل قبول حفظ شود.

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

فرآیندهای اندروید از بالاترین امتیاز به پایین‌ترین امتیاز رتبه‌بندی شده‌اند: برنامه‌های پس‌زمینه، برنامه قبلی، برنامه خانگی، سرویس‌ها، برنامه‌های قابل مشاهده، برنامه پیش‌زمینه، مداوم، سیستمی و بومی.
شکل ۱. پردازش‌های اندروید، با امتیازهای بالا در بالا و امتیازهای پایین در پایین.

ابزارهای پروفایلینگ حافظه

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

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

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

پروفایلر حافظه اندروید استودیو

اندروید استودیو ، Memory Profiler را به عنوان بخشی از Android Profiler ارائه می‌دهد که به شما در شناسایی نشت حافظه و از دست دادن حافظه که می‌تواند منجر به وقفه، هنگ کردن و حتی از کار افتادن برنامه شود، کمک می‌کند. این Profiler یک نمودار بلادرنگ از میزان استفاده از حافظه برنامه شما نشان می‌دهد و به شما امکان می‌دهد تا یک heap dump را ضبط کنید، garbage collection را اجباری کنید و تخصیص حافظه را پیگیری کنید.

شکل 2. مشاهده ارجاعات سراسری JNI در پروفایلر حافظه اندروید استودیو.

ابزارهای پروفایلینگ حافظه در یونیتی

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

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

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

ابزار دوم، پکیج Memory Profiler است که یک پکیج Unity است که می‌توانید به پروژه خود اضافه کنید. این پکیج یک پنجره Memory Profiler اضافی به ویرایشگر Unity اضافه می‌کند. Memory Profiler به شما امکان می‌دهد تا میزان استفاده از حافظه را در برنامه خود با جزئیات بیشتری تجزیه و تحلیل کنید. می‌توانید snapshotها را ذخیره و مقایسه کنید تا نشتی حافظه را پیدا کنید یا طرح‌بندی حافظه را ببینید تا مشکلات تکه‌تکه شدن حافظه را پیدا کنید.

شکل ۴. تحلیل یک اسنپ‌شات حافظه با استفاده از پنجره‌ی پروفایل حافظه.

بینش‌های حافظه غیرواقعی

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

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

از نسخه ۵.۴ به بعد، Memory Insights از ردیابی حافظه با استفاده از callstacks برای پروژه‌های اندروید پشتیبانی می‌کند.

ردیاب بینش حافظه که نمودار حافظه اصلی، تعداد تخصیص زنده و تعداد رویدادهای تخصیص/آزاد را نشان می‌دهد.
شکل 5. ردیاب بینش‌های حافظه‌ی آنریل.

بینش‌های کم حافظه

اندروید callbackها و APIهایی را ارائه می‌دهد که به شما امکان می‌دهند نیازهای حافظه بازی خود را کاهش دهید و دلیل خاتمه یافتن اجرای بازی‌های قبلی را تعیین کنید.

تماس‌های برگشتی

برای فراخوانی‌های trim منسوخ‌شده ثبت‌نام نکنید. اندروید هیچ API برای تشخیص رویدادهای فشار بر حافظه‌ی بومی، زمانی که سیستم با محدودیت حافظه مواجه است، ندارد. فراخوانی‌های trim در جلوگیری از killهای ناشی از کمبود حافظه مفید نبوده‌اند، بنابراین اندروید همه‌ی آن‌ها را به جز TRIM_MEMORY_UI_HIDDEN و TRIM_MEMORY_BACKGROUND منسوخ کرده است.

خاتمه بازی

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

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

  • استفاده از ApplicationExitInfo : این API دلیل توقف اجرای قبلی بازی توسط سیستم اندروید را برمی‌گرداند. از ApplicationExitInfo برای بررسی کمبود حافظه به عنوان دلیل توقف اجرای قبلی فرآیند استفاده کنید. بررسی کنید که آیا بازی به دلیل کمبود حافظه متوقف شده است یا خیر، تا بتوان بازی را برای استفاده کمتر از حافظه در آن دستگاه بهینه کرد.
  • به کل رم فیزیکی توجه کنید: برای جلوگیری از بسته شدن بازی‌ها در حالت اجرا و تطبیق آنها با قابلیت‌های دستگاه، به کل رم فیزیکی هر دستگاه توجه کنید تا بتوانید میزان استفاده از حافظه بازی را بر اساس آن تنظیم کنید. اگر هدف جلوگیری از بسته شدن برنامه‌ها بلافاصله پس از انتقال به پس‌زمینه است (برای اینکه به بازیکن اجازه دهید چند کار را همزمان انجام دهد)، از توابع فراخوانی trim (به طور خاص TRIM_MEMORY_UI_HIDDEN ) برای کاهش استفاده از حافظه بازی خود استفاده کنید.

منابع اضافی

،

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

فرآیند دیمنِ قاتل حافظه کم اندروید (LMK) وضعیت حافظه یک سیستم اندروید در حال اجرا را رصد می‌کند و با از بین بردن فرآیندهای کم‌اهمیت‌تر، به فشار بالای حافظه واکنش نشان می‌دهد تا عملکرد سیستم در سطوح قابل قبول حفظ شود.

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

فرآیندهای اندروید از بالاترین امتیاز به پایین‌ترین امتیاز رتبه‌بندی شده‌اند: برنامه‌های پس‌زمینه، برنامه قبلی، برنامه خانگی، سرویس‌ها، برنامه‌های قابل مشاهده، برنامه پیش‌زمینه، مداوم، سیستمی و بومی.
شکل ۱. پردازش‌های اندروید، با امتیازهای بالا در بالا و امتیازهای پایین در پایین.

ابزارهای پروفایلینگ حافظه

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

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

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

پروفایلر حافظه اندروید استودیو

اندروید استودیو ، Memory Profiler را به عنوان بخشی از Android Profiler ارائه می‌دهد که به شما در شناسایی نشت حافظه و از دست دادن حافظه که می‌تواند منجر به وقفه، هنگ کردن و حتی از کار افتادن برنامه شود، کمک می‌کند. این Profiler یک نمودار بلادرنگ از میزان استفاده از حافظه برنامه شما نشان می‌دهد و به شما امکان می‌دهد تا یک heap dump را ضبط کنید، garbage collection را اجباری کنید و تخصیص حافظه را پیگیری کنید.

شکل 2. مشاهده ارجاعات سراسری JNI در پروفایلر حافظه اندروید استودیو.

ابزارهای پروفایلینگ حافظه در یونیتی

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

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

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

ابزار دوم، پکیج Memory Profiler است که یک پکیج Unity است که می‌توانید به پروژه خود اضافه کنید. این پکیج یک پنجره Memory Profiler اضافی به ویرایشگر Unity اضافه می‌کند. Memory Profiler به شما امکان می‌دهد تا میزان استفاده از حافظه را در برنامه خود با جزئیات بیشتری تجزیه و تحلیل کنید. می‌توانید snapshotها را ذخیره و مقایسه کنید تا نشتی حافظه را پیدا کنید یا طرح‌بندی حافظه را ببینید تا مشکلات تکه‌تکه شدن حافظه را پیدا کنید.

شکل ۴. تحلیل یک اسنپ‌شات حافظه با استفاده از پنجره‌ی پروفایل حافظه.

بینش‌های حافظه غیرواقعی

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

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

از نسخه ۵.۴ به بعد، Memory Insights از ردیابی حافظه با استفاده از callstacks برای پروژه‌های اندروید پشتیبانی می‌کند.

ردیاب بینش حافظه که نمودار حافظه اصلی، تعداد تخصیص زنده و تعداد رویدادهای تخصیص/آزاد را نشان می‌دهد.
شکل 5. ردیاب بینش‌های حافظه‌ی آنریل.

بینش‌های کم حافظه

اندروید callbackها و APIهایی را ارائه می‌دهد که به شما امکان می‌دهند نیازهای حافظه بازی خود را کاهش دهید و دلیل خاتمه یافتن اجرای بازی‌های قبلی را تعیین کنید.

تماس‌های برگشتی

برای فراخوانی‌های trim منسوخ‌شده ثبت‌نام نکنید. اندروید هیچ API برای تشخیص رویدادهای فشار بر حافظه‌ی بومی، زمانی که سیستم با محدودیت حافظه مواجه است، ندارد. فراخوانی‌های trim در جلوگیری از killهای ناشی از کمبود حافظه مفید نبوده‌اند، بنابراین اندروید همه‌ی آن‌ها را به جز TRIM_MEMORY_UI_HIDDEN و TRIM_MEMORY_BACKGROUND منسوخ کرده است.

خاتمه بازی

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

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

  • استفاده از ApplicationExitInfo : این API دلیل توقف اجرای قبلی بازی توسط سیستم اندروید را برمی‌گرداند. از ApplicationExitInfo برای بررسی کمبود حافظه به عنوان دلیل توقف اجرای قبلی فرآیند استفاده کنید. بررسی کنید که آیا بازی به دلیل کمبود حافظه متوقف شده است یا خیر، تا بتوان بازی را برای استفاده کمتر از حافظه در آن دستگاه بهینه کرد.
  • به کل رم فیزیکی توجه کنید: برای جلوگیری از بسته شدن بازی‌ها در حالت اجرا و تطبیق آنها با قابلیت‌های دستگاه، به کل رم فیزیکی هر دستگاه توجه کنید تا بتوانید میزان استفاده از حافظه بازی را بر اساس آن تنظیم کنید. اگر هدف جلوگیری از بسته شدن برنامه‌ها بلافاصله پس از انتقال به پس‌زمینه است (برای اینکه به بازیکن اجازه دهید چند کار را همزمان انجام دهد)، از توابع فراخوانی trim (به طور خاص TRIM_MEMORY_UI_HIDDEN ) برای کاهش استفاده از حافظه بازی خود استفاده کنید.

منابع اضافی

،

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

فرآیند دیمنِ قاتل حافظه کم اندروید (LMK) وضعیت حافظه یک سیستم اندروید در حال اجرا را رصد می‌کند و با از بین بردن فرآیندهای کم‌اهمیت‌تر، به فشار بالای حافظه واکنش نشان می‌دهد تا عملکرد سیستم در سطوح قابل قبول حفظ شود.

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

فرآیندهای اندروید از بالاترین امتیاز به پایین‌ترین امتیاز رتبه‌بندی شده‌اند: برنامه‌های پس‌زمینه، برنامه قبلی، برنامه خانگی، سرویس‌ها، برنامه‌های قابل مشاهده، برنامه پیش‌زمینه، مداوم، سیستمی و بومی.
شکل ۱. پردازش‌های اندروید، با امتیازهای بالا در بالا و امتیازهای پایین در پایین.

ابزارهای پروفایلینگ حافظه

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

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

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

پروفایلر حافظه اندروید استودیو

اندروید استودیو ، Memory Profiler را به عنوان بخشی از Android Profiler ارائه می‌دهد که به شما در شناسایی نشت حافظه و از دست دادن حافظه که می‌تواند منجر به وقفه، هنگ کردن و حتی از کار افتادن برنامه شود، کمک می‌کند. این Profiler یک نمودار بلادرنگ از میزان استفاده از حافظه برنامه شما نشان می‌دهد و به شما امکان می‌دهد تا یک heap dump را ضبط کنید، garbage collection را اجباری کنید و تخصیص حافظه را پیگیری کنید.

شکل 2. مشاهده ارجاعات سراسری JNI در پروفایلر حافظه اندروید استودیو.

ابزارهای پروفایلینگ حافظه در یونیتی

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

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

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

ابزار دوم، پکیج Memory Profiler است که یک پکیج Unity است که می‌توانید به پروژه خود اضافه کنید. این پکیج یک پنجره Memory Profiler اضافی به ویرایشگر Unity اضافه می‌کند. Memory Profiler به شما امکان می‌دهد تا میزان استفاده از حافظه را در برنامه خود با جزئیات بیشتری تجزیه و تحلیل کنید. می‌توانید snapshotها را ذخیره و مقایسه کنید تا نشتی حافظه را پیدا کنید یا طرح‌بندی حافظه را ببینید تا مشکلات تکه‌تکه شدن حافظه را پیدا کنید.

شکل ۴. تحلیل یک اسنپ‌شات حافظه با استفاده از پنجره‌ی پروفایل حافظه.

بینش‌های حافظه غیرواقعی

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

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

از نسخه ۵.۴ به بعد، Memory Insights از ردیابی حافظه با استفاده از callstacks برای پروژه‌های اندروید پشتیبانی می‌کند.

ردیاب بینش حافظه که نمودار حافظه اصلی، تعداد تخصیص زنده و تعداد رویدادهای تخصیص/آزاد را نشان می‌دهد.
شکل 5. ردیاب بینش‌های حافظه‌ی آنریل.

بینش‌های کم حافظه

اندروید callbackها و APIهایی را ارائه می‌دهد که به شما امکان می‌دهند نیازهای حافظه بازی خود را کاهش دهید و دلیل خاتمه یافتن اجرای بازی‌های قبلی را تعیین کنید.

تماس‌های برگشتی

برای فراخوانی‌های trim منسوخ‌شده ثبت‌نام نکنید. اندروید هیچ API برای تشخیص رویدادهای فشار بر حافظه‌ی بومی، زمانی که سیستم با محدودیت حافظه مواجه است، ندارد. فراخوانی‌های trim در جلوگیری از killهای ناشی از کمبود حافظه مفید نبوده‌اند، بنابراین اندروید همه‌ی آن‌ها را به جز TRIM_MEMORY_UI_HIDDEN و TRIM_MEMORY_BACKGROUND منسوخ کرده است.

خاتمه بازی

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

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

  • استفاده از ApplicationExitInfo : این API دلیل توقف اجرای قبلی بازی توسط سیستم اندروید را برمی‌گرداند. از ApplicationExitInfo برای بررسی کمبود حافظه به عنوان دلیل توقف اجرای قبلی فرآیند استفاده کنید. بررسی کنید که آیا بازی به دلیل کمبود حافظه متوقف شده است یا خیر، تا بتوان بازی را برای استفاده کمتر از حافظه در آن دستگاه بهینه کرد.
  • به کل رم فیزیکی توجه کنید: برای جلوگیری از بسته شدن بازی‌ها در حالت اجرا و تطبیق آنها با قابلیت‌های دستگاه، به کل رم فیزیکی هر دستگاه توجه کنید تا بتوانید میزان استفاده از حافظه بازی را بر اساس آن تنظیم کنید. اگر هدف جلوگیری از بسته شدن برنامه‌ها بلافاصله پس از انتقال به پس‌زمینه است (برای اینکه به بازیکن اجازه دهید چند کار را همزمان انجام دهد)، از توابع فراخوانی trim (به طور خاص TRIM_MEMORY_UI_HIDDEN ) برای کاهش استفاده از حافظه بازی خود استفاده کنید.

منابع اضافی