پلتفرم اندروید با این فرض اجرا می شود که حافظه آزاد حافظه هدر رفته است. سعی می کند همیشه از تمام حافظه موجود استفاده کند. برای مثال، سیستم پس از بسته شدن برنامهها را در حافظه نگه میدارد تا کاربر بتواند به سرعت به آنها برگردد. به همین دلیل، دستگاه های اندرویدی اغلب با حافظه خالی بسیار کمی کار می کنند. مدیریت حافظه برای تخصیص مناسب حافظه در میان فرآیندهای مهم سیستم و بسیاری از برنامه های کاربردی کاربر حیاتی است.
این صفحه اصول اولیه نحوه تخصیص حافظه را برای سیستم و برنامه های کاربر مورد بحث قرار می دهد. همچنین توضیح می دهد که سیستم عامل چگونه به موقعیت های حافظه کم واکنش نشان می دهد.
انواع حافظه
دستگاه های اندرویدی دارای سه نوع حافظه مختلف هستند: RAM، zRAM و ذخیره سازی. توجه داشته باشید که CPU و GPU هر دو به یک RAM دسترسی دارند.
شکل 1. انواع حافظه - RAM، zRAM و ذخیره سازی
RAM سریعترین نوع حافظه است، اما معمولاً از نظر اندازه محدود است. دستگاه های رده بالا معمولاً بیشترین مقدار رم را دارند.
zRAM پارتیشنی از RAM است که برای فضای مبادله استفاده می شود. وقتی همه چیز در zRAM قرار میگیرد فشرده میشود و وقتی از zRAM کپی میشود از حالت فشرده خارج میشود. این بخش از RAM با انتقال یا خارج شدن صفحات به zRAM بزرگ یا کوچک می شود. سازندگان دستگاه می توانند حداکثر اندازه را تعیین کنند.
فضای ذخیرهسازی شامل تمام دادههای ثابت مانند سیستم فایل و کد شی موجود برای همه برنامهها، کتابخانهها و پلتفرم است. ظرفیت ذخیره سازی بسیار بیشتر از دو نوع حافظه دیگر است. در اندروید، فضای ذخیرهسازی مانند سایر پیادهسازیهای لینوکس برای جابهجایی فضای ذخیرهسازی استفاده نمیشود، زیرا نوشتن مکرر میتواند باعث فرسودگی این حافظه شود و عمر محیط ذخیرهسازی را کوتاه کند.
صفحات حافظه
RAM به صفحات تقسیم می شود. به طور معمول هر صفحه 4 کیلوبایت حافظه دارد.
صفحات یا رایگان یا استفاده شده در نظر گرفته می شوند. صفحات رایگان رم بدون استفاده هستند. صفحات استفاده شده RAM هستند که سیستم به طور فعال از آنها استفاده می کند و در دسته های زیر دسته بندی می شوند:
- حافظه پنهان: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی می شود (به عنوان مثال، فایل های کد یا نقشه برداری شده با حافظه). دو نوع حافظه کش وجود دارد:
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
kswapd
حذف شود تا حافظه آزاد افزایش یابد. - کثیف: کپی اصلاح شده فایل در ذخیره سازی. می توان با
kswapd
به zRAM منتقل یا در آن فشرده کرد تا حافظه آزاد افزایش یابد
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
- اشتراک گذاری شده: توسط چندین فرآیند استفاده می شود
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- ناشناس: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی نمی شود (به عنوان مثال، اختصاص داده شده توسط
mmap()
با مجموعه پرچمMAP_ANONYMOUS
)- کثیف: می تواند در zRAM توسط
kswapd
جابجا یا فشرده شود تا حافظه آزاد افزایش یابد
- کثیف: می تواند در zRAM توسط
نسبت صفحات آزاد و استفاده شده در طول زمان متفاوت است زیرا سیستم به طور فعال RAM را مدیریت می کند. مفاهیم معرفی شده در این بخش کلیدی برای مدیریت موقعیت های کم حافظه هستند. بخش بعدی این سند آنها را با جزئیات بیشتری توضیح می دهد.
مدیریت حافظه کم
اندروید دو مکانیسم اصلی برای مقابله با موقعیتهای حافظه کم دارد: دیمون مبادله هسته و قاتل با حافظه کم.
دیمون مبادله هسته
دیمون مبادله هسته ( kswapd
) بخشی از هسته لینوکس است و حافظه استفاده شده را به حافظه آزاد تبدیل می کند. دیمون زمانی فعال می شود که حافظه رایگان دستگاه کم شود. هسته لینوکس آستانه های حافظه آزاد کم و زیاد را حفظ می کند. وقتی حافظه آزاد به زیر آستانه پایین میرود، kswapd
شروع به بازیابی حافظه میکند. هنگامی که حافظه آزاد به آستانه بالا رسید، kswapd
بازیابی حافظه را متوقف می کند.
kswapd
میتواند صفحات تمیز را با حذف آنها بازیابی کند، زیرا آنها توسط فضای ذخیرهسازی پشتیبانی میشوند و اصلاح نشدهاند. اگر فرآیندی سعی کند به صفحه تمیزی که حذف شده است آدرس دهد، سیستم صفحه را از فضای ذخیره سازی به RAM کپی می کند. این عملیات به عنوان صفحه بندی تقاضا شناخته می شود.
شکل 2. صفحه تمیز، با پشتوانه ذخیره سازی، حذف شده است
kswapd
می تواند صفحات کثیف خصوصی کش شده و صفحات کثیف ناشناس را به zRAM منتقل کند، جایی که آنها فشرده می شوند. با انجام این کار، حافظه موجود در RAM (صفحات رایگان) آزاد می شود. اگر فرآیندی سعی کند یک صفحه کثیف را در zRAM لمس کند، صفحه فشرده نشده و به RAM منتقل می شود. اگر فرآیند مرتبط با یک صفحه فشرده کشته شود، صفحه از zRAM حذف می شود.
اگر مقدار حافظه آزاد کمتر از یک آستانه مشخص شود، سیستم شروع به کشتن فرآیندها می کند.
شکل 3. صفحه کثیف به zRAM منتقل شد و فشرده شد
قاتل کم حافظه
بسیاری از اوقات، kswapd
نمی تواند حافظه کافی برای سیستم آزاد کند. در این مورد، سیستم از onTrimMemory()
برای اطلاع رسانی به یک برنامه مبنی بر کم شدن حافظه و اینکه باید تخصیص آن را کاهش دهد، استفاده می کند. اگر این کافی نباشد، هسته شروع به کشتن فرآیندها برای آزاد کردن حافظه می کند. برای این کار از کشنده کم حافظه (LMK) استفاده می کند.
برای تصمیم گیری در مورد اینکه کدام فرآیند را بکشد، LMK از یک امتیاز "خارج از حافظه" به نام oom_adj_score
برای اولویت بندی فرآیندهای در حال اجرا استفاده می کند. فرآیندهایی که امتیاز بالایی دارند ابتدا کشته می شوند. برنامههای پسزمینه ابتدا از بین میروند و پردازشهای سیستم آخرین هستند. جدول زیر دسته های امتیازدهی LMK را از بالا به پایین فهرست می کند. مواردی که در رده بالاترین امتیاز، در ردیف اول قرار دارند، ابتدا کشته خواهند شد:
شکل 4. فرآیندهای اندروید، با نمرات بالا در بالا و امتیازات پایین در پایین
اینها توضیحاتی برای دسته بندی های مختلف در جدول بالا هستند:
برنامه های پس زمینه: برنامه هایی که قبلا اجرا شده اند و در حال حاضر فعال نیستند. LMK ابتدا برنامههای پسزمینه را با برنامهای که بالاترین
oom_adj_score
را دارد، از بین میبرد.برنامه قبلی: جدیدترین برنامه پس زمینه استفاده شده. برنامه قبلی نسبت به برنامههای پسزمینه اولویت بالاتری دارد (امتیاز کمتری دارد)، زیرا احتمال بیشتری دارد که کاربر به آن سوئیچ کند تا یکی از برنامههای پسزمینه.
برنامه Home: این برنامه لانچر است. کشتن این باعث می شود که کاغذ دیواری ناپدید شود.
خدمات: سرویس ها توسط برنامه ها شروع می شوند و ممکن است شامل همگام سازی یا آپلود در فضای ابری باشند.
برنامه های قابل درک: برنامه های غیر پیش زمینه ای که به نوعی برای کاربر قابل درک هستند، مانند اجرای فرآیند جستجو که یک رابط کاربری کوچک را نشان می دهد یا گوش دادن به موسیقی.
برنامه پیش زمینه: برنامه ای که در حال حاضر استفاده می شود. از بین بردن برنامه پیش زمینه مانند خرابی برنامه به نظر می رسد که ممکن است به کاربر نشان دهد که مشکلی در دستگاه پیش می رود.
پایدار (خدمات): اینها خدمات اصلی برای دستگاه هستند، مانند تلفن و وای فای.
سیستم: فرآیندهای سیستم. با از بین رفتن این فرآیندها، ممکن است به نظر برسد که گوشی دوباره راه اندازی می شود.
Native: فرآیندهای سطح بسیار پایین مورد استفاده توسط سیستم (به عنوان مثال،
kswapd
).
سازندگان دستگاه می توانند رفتار LMK را تغییر دهند.
محاسبه ردپای حافظه
هسته تمام صفحات حافظه را در سیستم ردیابی می کند.
شکل 5. صفحات مورد استفاده توسط فرآیندهای مختلف
هنگام تعیین مقدار حافظه ای که توسط یک برنامه استفاده می شود، سیستم باید صفحات مشترک را در نظر بگیرد. برنامه هایی که به همان سرویس یا کتابخانه دسترسی دارند، صفحات حافظه را به اشتراک خواهند گذاشت. به عنوان مثال، خدمات Google Play و یک برنامه بازی ممکن است یک سرویس مکان را به اشتراک بگذارند. این امر تعیین میزان حافظه اختصاصی سرویس به طور گسترده در برابر هر برنامه را دشوار می کند.
شکل 6. صفحات به اشتراک گذاشته شده توسط دو برنامه (وسط)
برای تعیین ردپای حافظه برای یک برنامه، هر یک از معیارهای زیر ممکن است استفاده شود:
- Resident Set Size (RSS): تعداد صفحات به اشتراک گذاشته شده و غیر اشتراکی مورد استفاده برنامه
- اندازه تنظیم متناسب (PSS): تعداد صفحات به اشتراک گذاشته نشده استفاده شده توسط برنامه و توزیع یکنواخت صفحات به اشتراک گذاشته شده (به عنوان مثال، اگر سه فرآیند 3 مگابایت به اشتراک بگذارند، هر فرآیند 1 مگابایت در PSS دریافت می کند)
- اندازه مجموعه منحصربهفرد (USS): تعداد صفحات غیر اشتراکگذاری شده مورد استفاده برنامه (صفحات اشتراکگذاری شده شامل نمیشود)
PSS زمانی برای سیستم عامل مفید است که میخواهد بداند چه مقدار حافظه توسط همه فرآیندها استفاده میشود، زیرا صفحات چندین بار شمارش نمیشوند. محاسبه PSS زمان زیادی می برد زیرا سیستم باید تعیین کند که کدام صفحات و بر اساس چند فرآیند به اشتراک گذاشته می شوند. RSS بین صفحات اشتراکگذاری شده و غیر اشتراکگذاری شده تمایز قائل نمیشود (محاسبه آن را سریعتر میکند) و برای ردیابی تغییرات در تخصیص حافظه بهتر است.
منابع اضافی
- مروری بر مدیریت حافظه
- فرآیندها و چرخه حیات برنامه
- درک میزان استفاده از حافظه اندروید - ارائه Google I/O
- حافظه و بازیهای Android - ارائه Google I/O
- دیمون قاتل با حافظه کم اندروید
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- زمان راه اندازی اپلیکیشن
پلتفرم اندروید با این فرض اجرا می شود که حافظه آزاد حافظه هدر رفته است. سعی می کند همیشه از تمام حافظه موجود استفاده کند. برای مثال، سیستم پس از بسته شدن برنامهها را در حافظه نگه میدارد تا کاربر بتواند به سرعت به آنها برگردد. به همین دلیل، دستگاه های اندرویدی اغلب با حافظه خالی بسیار کمی کار می کنند. مدیریت حافظه برای تخصیص مناسب حافظه در میان فرآیندهای مهم سیستم و بسیاری از برنامه های کاربردی کاربر حیاتی است.
این صفحه اصول اولیه نحوه تخصیص حافظه را برای سیستم و برنامه های کاربر مورد بحث قرار می دهد. همچنین توضیح می دهد که سیستم عامل چگونه به موقعیت های حافظه کم واکنش نشان می دهد.
انواع حافظه
دستگاه های اندرویدی دارای سه نوع حافظه مختلف هستند: RAM، zRAM و ذخیره سازی. توجه داشته باشید که CPU و GPU هر دو به یک RAM دسترسی دارند.
شکل 1. انواع حافظه - RAM، zRAM و ذخیره سازی
RAM سریعترین نوع حافظه است، اما معمولاً از نظر اندازه محدود است. دستگاه های رده بالا معمولاً بیشترین مقدار رم را دارند.
zRAM پارتیشنی از RAM است که برای فضای مبادله استفاده می شود. وقتی همه چیز در zRAM قرار میگیرد فشرده میشود و وقتی از zRAM کپی میشود از حالت فشرده خارج میشود. این بخش از RAM با انتقال یا خارج شدن صفحات به zRAM بزرگ یا کوچک می شود. سازندگان دستگاه می توانند حداکثر اندازه را تعیین کنند.
فضای ذخیرهسازی شامل تمام دادههای ثابت مانند سیستم فایل و کد شی موجود برای همه برنامهها، کتابخانهها و پلتفرم است. ظرفیت ذخیره سازی بسیار بیشتر از دو نوع حافظه دیگر است. در اندروید، فضای ذخیرهسازی مانند سایر پیادهسازیهای لینوکس برای جابهجایی فضای ذخیرهسازی استفاده نمیشود، زیرا نوشتن مکرر میتواند باعث فرسودگی این حافظه شود و عمر محیط ذخیرهسازی را کوتاه کند.
صفحات حافظه
RAM به صفحات تقسیم می شود. به طور معمول هر صفحه 4 کیلوبایت حافظه دارد.
صفحات یا رایگان یا استفاده شده در نظر گرفته می شوند. صفحات رایگان رم بدون استفاده هستند. صفحات استفاده شده RAM هستند که سیستم به طور فعال از آنها استفاده می کند و در دسته های زیر دسته بندی می شوند:
- حافظه پنهان: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی می شود (به عنوان مثال، فایل های کد یا نقشه برداری شده با حافظه). دو نوع حافظه کش وجود دارد:
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
kswapd
حذف شود تا حافظه آزاد افزایش یابد. - کثیف: کپی اصلاح شده فایل در ذخیره سازی. می توان با
kswapd
به zRAM منتقل یا در آن فشرده کرد تا حافظه آزاد افزایش یابد
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
- اشتراک گذاری شده: توسط چندین فرآیند استفاده می شود
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- ناشناس: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی نمی شود (به عنوان مثال، اختصاص داده شده توسط
mmap()
با مجموعه پرچمMAP_ANONYMOUS
)- کثیف: می تواند در zRAM توسط
kswapd
جابجا یا فشرده شود تا حافظه آزاد افزایش یابد
- کثیف: می تواند در zRAM توسط
نسبت صفحات آزاد و استفاده شده در طول زمان متفاوت است زیرا سیستم به طور فعال RAM را مدیریت می کند. مفاهیم معرفی شده در این بخش کلیدی برای مدیریت موقعیت های کم حافظه هستند. بخش بعدی این سند آنها را با جزئیات بیشتری توضیح می دهد.
مدیریت حافظه کم
اندروید دو مکانیسم اصلی برای مقابله با موقعیتهای حافظه کم دارد: دیمون مبادله هسته و قاتل با حافظه کم.
دیمون مبادله هسته
دیمون مبادله هسته ( kswapd
) بخشی از هسته لینوکس است و حافظه استفاده شده را به حافظه آزاد تبدیل می کند. دیمون زمانی فعال می شود که حافظه رایگان دستگاه کم شود. هسته لینوکس آستانه های حافظه آزاد کم و زیاد را حفظ می کند. وقتی حافظه آزاد به زیر آستانه پایین میرود، kswapd
شروع به بازیابی حافظه میکند. هنگامی که حافظه آزاد به آستانه بالا رسید، kswapd
بازیابی حافظه را متوقف می کند.
kswapd
میتواند صفحات تمیز را با حذف آنها بازیابی کند، زیرا آنها توسط فضای ذخیرهسازی پشتیبانی میشوند و اصلاح نشدهاند. اگر فرآیندی سعی کند به صفحه تمیزی که حذف شده است آدرس دهد، سیستم صفحه را از فضای ذخیره سازی به RAM کپی می کند. این عملیات به عنوان صفحه بندی تقاضا شناخته می شود.
شکل 2. صفحه تمیز، با پشتوانه ذخیره سازی، حذف شده است
kswapd
می تواند صفحات کثیف خصوصی کش شده و صفحات کثیف ناشناس را به zRAM منتقل کند، جایی که آنها فشرده می شوند. با انجام این کار، حافظه موجود در RAM (صفحات رایگان) آزاد می شود. اگر فرآیندی سعی کند یک صفحه کثیف را در zRAM لمس کند، صفحه فشرده نشده و به RAM منتقل می شود. اگر فرآیند مرتبط با یک صفحه فشرده کشته شود، صفحه از zRAM حذف می شود.
اگر مقدار حافظه آزاد کمتر از یک آستانه مشخص شود، سیستم شروع به کشتن فرآیندها می کند.
شکل 3. صفحه کثیف به zRAM منتقل شد و فشرده شد
قاتل کم حافظه
بسیاری از اوقات، kswapd
نمی تواند حافظه کافی برای سیستم آزاد کند. در این مورد، سیستم از onTrimMemory()
برای اطلاع رسانی به یک برنامه مبنی بر کم شدن حافظه و اینکه باید تخصیص آن را کاهش دهد، استفاده می کند. اگر این کافی نباشد، هسته شروع به کشتن فرآیندها برای آزاد کردن حافظه می کند. برای این کار از کشنده کم حافظه (LMK) استفاده می کند.
برای تصمیم گیری در مورد اینکه کدام فرآیند را بکشد، LMK از یک امتیاز "خارج از حافظه" به نام oom_adj_score
برای اولویت بندی فرآیندهای در حال اجرا استفاده می کند. فرآیندهایی که امتیاز بالایی دارند ابتدا کشته می شوند. برنامههای پسزمینه ابتدا از بین میروند و پردازشهای سیستم آخرین هستند. جدول زیر دسته های امتیازدهی LMK را از بالا به پایین فهرست می کند. مواردی که در رده بالاترین امتیاز، در ردیف اول قرار دارند، ابتدا کشته خواهند شد:
شکل 4. فرآیندهای اندروید، با نمرات بالا در بالا و امتیازات پایین در پایین
اینها توضیحاتی برای دسته بندی های مختلف در جدول بالا هستند:
برنامه های پس زمینه: برنامه هایی که قبلا اجرا شده اند و در حال حاضر فعال نیستند. LMK ابتدا برنامههای پسزمینه را با برنامهای که بالاترین
oom_adj_score
را دارد، از بین میبرد.برنامه قبلی: جدیدترین برنامه پس زمینه استفاده شده. برنامه قبلی نسبت به برنامههای پسزمینه اولویت بالاتری دارد (امتیاز کمتری دارد)، زیرا احتمال بیشتری دارد که کاربر به آن سوئیچ کند تا یکی از برنامههای پسزمینه.
برنامه Home: این برنامه لانچر است. کشتن این باعث می شود که کاغذ دیواری ناپدید شود.
خدمات: سرویس ها توسط برنامه ها شروع می شوند و ممکن است شامل همگام سازی یا آپلود در فضای ابری باشند.
برنامه های قابل درک: برنامه های غیر پیش زمینه ای که به نوعی برای کاربر قابل درک هستند، مانند اجرای فرآیند جستجو که یک رابط کاربری کوچک را نشان می دهد یا گوش دادن به موسیقی.
برنامه پیش زمینه: برنامه ای که در حال حاضر استفاده می شود. از بین بردن برنامه پیش زمینه مانند خرابی برنامه به نظر می رسد که ممکن است به کاربر نشان دهد که مشکلی در دستگاه پیش می رود.
پایدار (خدمات): اینها خدمات اصلی برای دستگاه هستند، مانند تلفن و وای فای.
سیستم: فرآیندهای سیستم. با از بین رفتن این فرآیندها، ممکن است به نظر برسد که گوشی دوباره راه اندازی می شود.
Native: فرآیندهای سطح بسیار پایین مورد استفاده توسط سیستم (به عنوان مثال،
kswapd
).
سازندگان دستگاه می توانند رفتار LMK را تغییر دهند.
محاسبه ردپای حافظه
هسته تمام صفحات حافظه را در سیستم ردیابی می کند.
شکل 5. صفحات مورد استفاده توسط فرآیندهای مختلف
هنگام تعیین مقدار حافظه ای که توسط یک برنامه استفاده می شود، سیستم باید صفحات مشترک را در نظر بگیرد. برنامه هایی که به همان سرویس یا کتابخانه دسترسی دارند، صفحات حافظه را به اشتراک خواهند گذاشت. به عنوان مثال، خدمات Google Play و یک برنامه بازی ممکن است یک سرویس مکان را به اشتراک بگذارند. این امر تعیین میزان حافظه اختصاصی سرویس به طور گسترده در برابر هر برنامه را دشوار می کند.
شکل 6. صفحات به اشتراک گذاشته شده توسط دو برنامه (وسط)
برای تعیین ردپای حافظه برای یک برنامه، هر یک از معیارهای زیر ممکن است استفاده شود:
- Resident Set Size (RSS): تعداد صفحات به اشتراک گذاشته شده و غیر اشتراکی مورد استفاده برنامه
- اندازه تنظیم متناسب (PSS): تعداد صفحات به اشتراک گذاشته نشده استفاده شده توسط برنامه و توزیع یکنواخت صفحات به اشتراک گذاشته شده (به عنوان مثال، اگر سه فرآیند 3 مگابایت به اشتراک بگذارند، هر فرآیند 1 مگابایت در PSS دریافت می کند)
- اندازه مجموعه منحصربهفرد (USS): تعداد صفحات غیر اشتراکگذاری شده مورد استفاده برنامه (صفحات اشتراکگذاری شده شامل نمیشود)
PSS زمانی برای سیستم عامل مفید است که میخواهد بداند چه مقدار حافظه توسط همه فرآیندها استفاده میشود، زیرا صفحات چندین بار شمارش نمیشوند. محاسبه PSS زمان زیادی می برد زیرا سیستم باید تعیین کند که کدام صفحات و بر اساس چند فرآیند به اشتراک گذاشته می شوند. RSS بین صفحات اشتراکگذاری شده و غیر اشتراکگذاری شده تمایز قائل نمیشود (محاسبه آن را سریعتر میکند) و برای ردیابی تغییرات در تخصیص حافظه بهتر است.
منابع اضافی
- مروری بر مدیریت حافظه
- فرآیندها و چرخه حیات برنامه
- درک میزان استفاده از حافظه اندروید - ارائه Google I/O
- حافظه و بازیهای Android - ارائه Google I/O
- دیمون قاتل با حافظه کم اندروید
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- زمان راه اندازی اپلیکیشن
پلتفرم اندروید با این فرض اجرا می شود که حافظه آزاد حافظه هدر رفته است. سعی می کند همیشه از تمام حافظه موجود استفاده کند. برای مثال، سیستم پس از بسته شدن برنامهها را در حافظه نگه میدارد تا کاربر بتواند به سرعت به آنها برگردد. به همین دلیل، دستگاه های اندرویدی اغلب با حافظه خالی بسیار کمی کار می کنند. مدیریت حافظه برای تخصیص مناسب حافظه در میان فرآیندهای مهم سیستم و بسیاری از برنامه های کاربردی کاربر حیاتی است.
این صفحه اصول اولیه نحوه تخصیص حافظه را برای سیستم و برنامه های کاربر مورد بحث قرار می دهد. همچنین توضیح می دهد که سیستم عامل چگونه به موقعیت های حافظه کم واکنش نشان می دهد.
انواع حافظه
دستگاه های اندرویدی دارای سه نوع حافظه مختلف هستند: RAM، zRAM و ذخیره سازی. توجه داشته باشید که CPU و GPU هر دو به یک RAM دسترسی دارند.
شکل 1. انواع حافظه - RAM، zRAM و ذخیره سازی
RAM سریعترین نوع حافظه است، اما معمولاً از نظر اندازه محدود است. دستگاه های رده بالا معمولاً بیشترین مقدار رم را دارند.
zRAM پارتیشنی از RAM است که برای فضای مبادله استفاده می شود. وقتی همه چیز در zRAM قرار میگیرد فشرده میشود و وقتی از zRAM کپی میشود از حالت فشرده خارج میشود. این بخش از RAM با انتقال یا خارج شدن صفحات به zRAM بزرگ یا کوچک می شود. سازندگان دستگاه می توانند حداکثر اندازه را تعیین کنند.
فضای ذخیرهسازی شامل تمام دادههای ثابت مانند سیستم فایل و کد شی موجود برای همه برنامهها، کتابخانهها و پلتفرم است. ظرفیت ذخیره سازی بسیار بیشتر از دو نوع حافظه دیگر است. در اندروید، فضای ذخیرهسازی مانند سایر پیادهسازیهای لینوکس برای جابهجایی فضای ذخیرهسازی استفاده نمیشود، زیرا نوشتن مکرر میتواند باعث فرسودگی این حافظه شود و عمر محیط ذخیرهسازی را کوتاه کند.
صفحات حافظه
RAM به صفحات تقسیم می شود. به طور معمول هر صفحه 4 کیلوبایت حافظه دارد.
صفحات یا رایگان یا استفاده شده در نظر گرفته می شوند. صفحات رایگان رم بدون استفاده هستند. صفحات استفاده شده RAM هستند که سیستم به طور فعال از آنها استفاده می کند و در دسته های زیر دسته بندی می شوند:
- حافظه پنهان: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی می شود (به عنوان مثال، فایل های کد یا نقشه برداری شده با حافظه). دو نوع حافظه کش وجود دارد:
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
kswapd
حذف شود تا حافظه آزاد افزایش یابد. - کثیف: کپی اصلاح شده فایل در ذخیره سازی. می توان با
kswapd
به zRAM منتقل یا در آن فشرده کرد تا حافظه آزاد افزایش یابد
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
- اشتراک گذاری شده: توسط چندین فرآیند استفاده می شود
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- ناشناس: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی نمی شود (به عنوان مثال، اختصاص داده شده توسط
mmap()
با مجموعه پرچمMAP_ANONYMOUS
)- کثیف: می تواند در zRAM توسط
kswapd
جابجا یا فشرده شود تا حافظه آزاد افزایش یابد
- کثیف: می تواند در zRAM توسط
نسبت صفحات آزاد و استفاده شده در طول زمان متفاوت است زیرا سیستم به طور فعال RAM را مدیریت می کند. مفاهیم معرفی شده در این بخش کلیدی برای مدیریت موقعیت های کم حافظه هستند. بخش بعدی این سند آنها را با جزئیات بیشتری توضیح می دهد.
مدیریت حافظه کم
اندروید دو مکانیسم اصلی برای مقابله با موقعیتهای حافظه کم دارد: دیمون مبادله هسته و قاتل با حافظه کم.
دیمون مبادله هسته
دیمون مبادله هسته ( kswapd
) بخشی از هسته لینوکس است و حافظه استفاده شده را به حافظه آزاد تبدیل می کند. دیمون زمانی فعال می شود که حافظه رایگان دستگاه کم شود. هسته لینوکس آستانه های حافظه آزاد کم و زیاد را حفظ می کند. وقتی حافظه آزاد به زیر آستانه پایین میرود، kswapd
شروع به بازیابی حافظه میکند. هنگامی که حافظه آزاد به آستانه بالا رسید، kswapd
بازیابی حافظه را متوقف می کند.
kswapd
میتواند صفحات تمیز را با حذف آنها بازیابی کند، زیرا آنها توسط فضای ذخیرهسازی پشتیبانی میشوند و اصلاح نشدهاند. اگر فرآیندی سعی کند به صفحه تمیزی که حذف شده است آدرس دهد، سیستم صفحه را از فضای ذخیره سازی به RAM کپی می کند. این عملیات به عنوان صفحه بندی تقاضا شناخته می شود.
شکل 2. صفحه تمیز، با پشتوانه ذخیره سازی، حذف شده است
kswapd
می تواند صفحات کثیف خصوصی کش شده و صفحات کثیف ناشناس را به zRAM منتقل کند، جایی که آنها فشرده می شوند. با انجام این کار، حافظه موجود در RAM (صفحات رایگان) آزاد می شود. اگر فرآیندی سعی کند یک صفحه کثیف را در zRAM لمس کند، صفحه فشرده نشده و به RAM منتقل می شود. اگر فرآیند مرتبط با یک صفحه فشرده کشته شود، صفحه از zRAM حذف می شود.
اگر مقدار حافظه آزاد کمتر از یک آستانه مشخص شود، سیستم شروع به کشتن فرآیندها می کند.
شکل 3. صفحه کثیف به zRAM منتقل شد و فشرده شد
قاتل کم حافظه
بسیاری از اوقات، kswapd
نمی تواند حافظه کافی برای سیستم آزاد کند. در این مورد، سیستم از onTrimMemory()
برای اطلاع رسانی به یک برنامه مبنی بر کم شدن حافظه و اینکه باید تخصیص آن را کاهش دهد، استفاده می کند. اگر این کافی نباشد، هسته شروع به کشتن فرآیندها برای آزاد کردن حافظه می کند. برای این کار از کشنده کم حافظه (LMK) استفاده می کند.
برای تصمیم گیری در مورد اینکه کدام فرآیند را بکشد، LMK از یک امتیاز "خارج از حافظه" به نام oom_adj_score
برای اولویت بندی فرآیندهای در حال اجرا استفاده می کند. فرآیندهایی که امتیاز بالایی دارند ابتدا کشته می شوند. برنامههای پسزمینه ابتدا از بین میروند و پردازشهای سیستم آخرین هستند. جدول زیر دسته های امتیازدهی LMK را از بالا به پایین فهرست می کند. مواردی که در رده بالاترین امتیاز، در ردیف اول قرار دارند، ابتدا کشته خواهند شد:
شکل 4. فرآیندهای اندروید، با نمرات بالا در بالا و امتیازات پایین در پایین
اینها توضیحاتی برای دسته بندی های مختلف در جدول بالا هستند:
برنامه های پس زمینه: برنامه هایی که قبلا اجرا شده اند و در حال حاضر فعال نیستند. LMK ابتدا برنامههای پسزمینه را با برنامهای که بالاترین
oom_adj_score
را دارد، از بین میبرد.برنامه قبلی: جدیدترین برنامه پس زمینه استفاده شده. برنامه قبلی نسبت به برنامههای پسزمینه اولویت بالاتری دارد (امتیاز کمتری دارد)، زیرا احتمال بیشتری دارد که کاربر به آن سوئیچ کند تا یکی از برنامههای پسزمینه.
برنامه Home: این برنامه لانچر است. کشتن این باعث می شود که کاغذ دیواری ناپدید شود.
خدمات: سرویس ها توسط برنامه ها شروع می شوند و ممکن است شامل همگام سازی یا آپلود در فضای ابری باشند.
برنامه های قابل درک: برنامه های غیر پیش زمینه ای که به نوعی برای کاربر قابل درک هستند، مانند اجرای فرآیند جستجو که یک رابط کاربری کوچک را نشان می دهد یا گوش دادن به موسیقی.
برنامه پیش زمینه: برنامه ای که در حال حاضر استفاده می شود. از بین بردن برنامه پیش زمینه مانند خرابی برنامه به نظر می رسد که ممکن است به کاربر نشان دهد که مشکلی در دستگاه پیش می رود.
پایدار (خدمات): اینها خدمات اصلی برای دستگاه هستند، مانند تلفن و وای فای.
سیستم: فرآیندهای سیستم. با از بین رفتن این فرآیندها، ممکن است به نظر برسد که گوشی دوباره راه اندازی می شود.
Native: فرآیندهای سطح بسیار پایین مورد استفاده توسط سیستم (به عنوان مثال،
kswapd
).
سازندگان دستگاه می توانند رفتار LMK را تغییر دهند.
محاسبه ردپای حافظه
هسته تمام صفحات حافظه را در سیستم ردیابی می کند.
شکل 5. صفحات مورد استفاده توسط فرآیندهای مختلف
هنگام تعیین مقدار حافظه ای که توسط یک برنامه استفاده می شود، سیستم باید صفحات مشترک را در نظر بگیرد. برنامه هایی که به همان سرویس یا کتابخانه دسترسی دارند، صفحات حافظه را به اشتراک خواهند گذاشت. به عنوان مثال، خدمات Google Play و یک برنامه بازی ممکن است یک سرویس مکان را به اشتراک بگذارند. این امر تعیین میزان حافظه اختصاصی سرویس به طور گسترده در برابر هر برنامه را دشوار می کند.
شکل 6. صفحات به اشتراک گذاشته شده توسط دو برنامه (وسط)
برای تعیین ردپای حافظه برای یک برنامه، هر یک از معیارهای زیر ممکن است استفاده شود:
- Resident Set Size (RSS): تعداد صفحات به اشتراک گذاشته شده و غیر اشتراکی مورد استفاده برنامه
- اندازه تنظیم متناسب (PSS): تعداد صفحات به اشتراک گذاشته نشده استفاده شده توسط برنامه و توزیع یکنواخت صفحات به اشتراک گذاشته شده (به عنوان مثال، اگر سه فرآیند 3 مگابایت به اشتراک بگذارند، هر فرآیند 1 مگابایت در PSS دریافت می کند)
- اندازه مجموعه منحصربهفرد (USS): تعداد صفحات غیر اشتراکگذاری شده مورد استفاده برنامه (صفحات اشتراکگذاری شده شامل نمیشود)
PSS زمانی برای سیستم عامل مفید است که میخواهد بداند چه مقدار حافظه توسط همه فرآیندها استفاده میشود، زیرا صفحات چندین بار شمارش نمیشوند. محاسبه PSS زمان زیادی می برد زیرا سیستم باید تعیین کند که کدام صفحات و بر اساس چند فرآیند به اشتراک گذاشته می شوند. RSS بین صفحات اشتراکگذاری شده و غیر اشتراکگذاری شده تمایز قائل نمیشود (محاسبه آن را سریعتر میکند) و برای ردیابی تغییرات در تخصیص حافظه بهتر است.
منابع اضافی
- مروری بر مدیریت حافظه
- فرآیندها و چرخه حیات برنامه
- درک میزان استفاده از حافظه اندروید - ارائه Google I/O
- حافظه و بازیهای Android - ارائه Google I/O
- دیمون قاتل با حافظه کم اندروید
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- زمان راه اندازی اپلیکیشن
پلتفرم اندروید با این فرض اجرا می شود که حافظه آزاد حافظه هدر رفته است. سعی می کند همیشه از تمام حافظه موجود استفاده کند. برای مثال، سیستم پس از بسته شدن برنامهها را در حافظه نگه میدارد تا کاربر بتواند به سرعت به آنها برگردد. به همین دلیل، دستگاه های اندرویدی اغلب با حافظه خالی بسیار کمی کار می کنند. مدیریت حافظه برای تخصیص مناسب حافظه در میان فرآیندهای مهم سیستم و بسیاری از برنامه های کاربردی کاربر حیاتی است.
این صفحه اصول اولیه نحوه تخصیص حافظه را برای سیستم و برنامه های کاربر مورد بحث قرار می دهد. همچنین توضیح می دهد که سیستم عامل چگونه به موقعیت های حافظه کم واکنش نشان می دهد.
انواع حافظه
دستگاه های اندرویدی دارای سه نوع حافظه مختلف هستند: RAM، zRAM و ذخیره سازی. توجه داشته باشید که CPU و GPU هر دو به یک RAM دسترسی دارند.
شکل 1. انواع حافظه - RAM، zRAM و ذخیره سازی
RAM سریعترین نوع حافظه است، اما معمولاً از نظر اندازه محدود است. دستگاه های رده بالا معمولاً بیشترین مقدار رم را دارند.
zRAM پارتیشنی از RAM است که برای فضای مبادله استفاده می شود. وقتی همه چیز در zRAM قرار میگیرد فشرده میشود و وقتی از zRAM کپی میشود از حالت فشرده خارج میشود. این بخش از RAM با انتقال یا خارج شدن صفحات به zRAM بزرگ یا کوچک می شود. سازندگان دستگاه می توانند حداکثر اندازه را تعیین کنند.
فضای ذخیرهسازی شامل تمام دادههای ثابت مانند سیستم فایل و کد شی موجود برای همه برنامهها، کتابخانهها و پلتفرم است. ظرفیت ذخیره سازی بسیار بیشتر از دو نوع حافظه دیگر است. در اندروید، فضای ذخیرهسازی مانند سایر پیادهسازیهای لینوکس برای جابهجایی فضای ذخیرهسازی استفاده نمیشود، زیرا نوشتن مکرر میتواند باعث فرسودگی این حافظه شود و عمر محیط ذخیرهسازی را کوتاه کند.
صفحات حافظه
RAM به صفحات تقسیم می شود. به طور معمول هر صفحه 4 کیلوبایت حافظه دارد.
صفحات یا رایگان یا استفاده شده در نظر گرفته می شوند. صفحات رایگان رم بدون استفاده هستند. صفحات استفاده شده RAM هستند که سیستم به طور فعال از آنها استفاده می کند و در دسته های زیر دسته بندی می شوند:
- حافظه پنهان: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی می شود (به عنوان مثال، فایل های کد یا نقشه برداری شده با حافظه). دو نوع حافظه کش وجود دارد:
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
kswapd
حذف شود تا حافظه آزاد افزایش یابد. - کثیف: کپی اصلاح شده فایل در ذخیره سازی. می توان با
kswapd
به zRAM منتقل یا در آن فشرده کرد تا حافظه آزاد افزایش یابد
- پاک: کپی اصلاح نشده یک فایل در فضای ذخیره سازی، می تواند توسط
- اشتراک گذاری شده: توسط چندین فرآیند استفاده می شود
- خصوصی: متعلق به یک فرآیند است و به اشتراک گذاشته نمی شود
- ناشناس: حافظه ای که توسط یک فایل در فضای ذخیره سازی پشتیبانی نمی شود (به عنوان مثال، اختصاص داده شده توسط
mmap()
با مجموعه پرچمMAP_ANONYMOUS
)- کثیف: می تواند در zRAM توسط
kswapd
جابجا یا فشرده شود تا حافظه آزاد افزایش یابد
- کثیف: می تواند در zRAM توسط
نسبت صفحات آزاد و استفاده شده در طول زمان متفاوت است زیرا سیستم به طور فعال RAM را مدیریت می کند. مفاهیم معرفی شده در این بخش کلیدی برای مدیریت موقعیت های کم حافظه هستند. بخش بعدی این سند آنها را با جزئیات بیشتری توضیح می دهد.
مدیریت حافظه کم
اندروید دو مکانیسم اصلی برای مقابله با موقعیتهای حافظه کم دارد: دیمون مبادله هسته و قاتل با حافظه کم.
دیمون مبادله هسته
دیمون مبادله هسته ( kswapd
) بخشی از هسته لینوکس است و حافظه استفاده شده را به حافظه آزاد تبدیل می کند. دیمون زمانی فعال می شود که حافظه رایگان دستگاه کم شود. هسته لینوکس آستانه های حافظه آزاد کم و زیاد را حفظ می کند. وقتی حافظه آزاد به زیر آستانه پایین میرود، kswapd
شروع به بازیابی حافظه میکند. هنگامی که حافظه آزاد به آستانه بالا رسید، kswapd
بازیابی حافظه را متوقف می کند.
kswapd
میتواند صفحات تمیز را با حذف آنها بازیابی کند، زیرا آنها توسط فضای ذخیرهسازی پشتیبانی میشوند و اصلاح نشدهاند. اگر فرآیندی سعی کند به صفحه تمیزی که حذف شده است آدرس دهد، سیستم صفحه را از فضای ذخیره سازی به RAM کپی می کند. این عملیات به عنوان صفحه بندی تقاضا شناخته می شود.
شکل 2. صفحه تمیز، با پشتوانه ذخیره سازی، حذف شده است
kswapd
می تواند صفحات کثیف خصوصی کش شده و صفحات کثیف ناشناس را به zRAM منتقل کند، جایی که آنها فشرده می شوند. با انجام این کار، حافظه موجود در RAM (صفحات رایگان) آزاد می شود. اگر فرآیندی سعی کند یک صفحه کثیف را در zRAM لمس کند، صفحه فشرده نشده و به RAM منتقل می شود. اگر فرآیند مرتبط با یک صفحه فشرده کشته شود، صفحه از zRAM حذف می شود.
اگر مقدار حافظه آزاد کمتر از یک آستانه مشخص شود، سیستم شروع به کشتن فرآیندها می کند.
شکل 3. صفحه کثیف به zRAM منتقل شد و فشرده شد
قاتل کم حافظه
بسیاری از اوقات، kswapd
نمی تواند حافظه کافی برای سیستم آزاد کند. در این مورد، سیستم از onTrimMemory()
برای اطلاع رسانی به یک برنامه مبنی بر کم شدن حافظه و اینکه باید تخصیص آن را کاهش دهد، استفاده می کند. اگر این کافی نباشد، هسته شروع به کشتن فرآیندها برای آزاد کردن حافظه می کند. برای این کار از کشنده کم حافظه (LMK) استفاده می کند.
برای تصمیم گیری در مورد اینکه کدام فرآیند را بکشد، LMK از یک امتیاز "خارج از حافظه" به نام oom_adj_score
برای اولویت بندی فرآیندهای در حال اجرا استفاده می کند. فرآیندهایی که امتیاز بالایی دارند ابتدا کشته می شوند. برنامههای پسزمینه ابتدا از بین میروند و پردازشهای سیستم آخرین هستند. جدول زیر دسته های امتیازدهی LMK را از بالا به پایین فهرست می کند. مواردی که در رده بالاترین امتیاز، در ردیف اول قرار دارند، ابتدا کشته خواهند شد:
شکل 4. فرآیندهای اندروید، با نمرات بالا در بالا و امتیازات پایین در پایین
اینها توضیحاتی برای دسته بندی های مختلف در جدول بالا هستند:
برنامه های پس زمینه: برنامه هایی که قبلا اجرا شده اند و در حال حاضر فعال نیستند. LMK ابتدا برنامههای پسزمینه را با برنامهای که بالاترین
oom_adj_score
را دارد، از بین میبرد.برنامه قبلی: جدیدترین برنامه پس زمینه استفاده شده. برنامه قبلی نسبت به برنامههای پسزمینه اولویت بالاتری دارد (امتیاز کمتری دارد)، زیرا احتمال بیشتری دارد که کاربر به آن سوئیچ کند تا یکی از برنامههای پسزمینه.
برنامه Home: این برنامه لانچر است. کشتن این باعث می شود که کاغذ دیواری ناپدید شود.
خدمات: سرویس ها توسط برنامه ها شروع می شوند و ممکن است شامل همگام سازی یا آپلود در فضای ابری باشند.
برنامه های قابل درک: برنامه های غیر پیش زمینه ای که به نوعی برای کاربر قابل درک هستند، مانند اجرای فرآیند جستجو که یک رابط کاربری کوچک را نشان می دهد یا گوش دادن به موسیقی.
برنامه پیش زمینه: برنامه ای که در حال حاضر استفاده می شود. از بین بردن برنامه پیش زمینه مانند خرابی برنامه به نظر می رسد که ممکن است به کاربر نشان دهد که مشکلی در دستگاه پیش می رود.
پایدار (خدمات): اینها خدمات اصلی برای دستگاه هستند، مانند تلفن و وای فای.
سیستم: فرآیندهای سیستم. با از بین رفتن این فرآیندها، ممکن است به نظر برسد که گوشی دوباره راه اندازی می شود.
Native: فرآیندهای سطح بسیار پایین مورد استفاده توسط سیستم (به عنوان مثال،
kswapd
).
سازندگان دستگاه می توانند رفتار LMK را تغییر دهند.
محاسبه ردپای حافظه
هسته تمام صفحات حافظه را در سیستم ردیابی می کند.
شکل 5. صفحات مورد استفاده توسط فرآیندهای مختلف
هنگام تعیین مقدار حافظه ای که توسط یک برنامه استفاده می شود، سیستم باید صفحات مشترک را در نظر بگیرد. برنامه هایی که به همان سرویس یا کتابخانه دسترسی دارند، صفحات حافظه را به اشتراک خواهند گذاشت. به عنوان مثال، خدمات Google Play و یک برنامه بازی ممکن است یک سرویس مکان را به اشتراک بگذارند. این امر تعیین میزان حافظه اختصاصی سرویس به طور گسترده در برابر هر برنامه را دشوار می کند.
شکل 6. صفحات به اشتراک گذاشته شده توسط دو برنامه (وسط)
برای تعیین ردپای حافظه برای یک برنامه، هر یک از معیارهای زیر ممکن است استفاده شود:
- Resident Set Size (RSS): تعداد صفحات به اشتراک گذاشته شده و غیر اشتراکی مورد استفاده برنامه
- اندازه تنظیم متناسب (PSS): تعداد صفحات به اشتراک گذاشته نشده استفاده شده توسط برنامه و توزیع یکنواخت صفحات به اشتراک گذاشته شده (به عنوان مثال، اگر سه فرآیند 3 مگابایت به اشتراک بگذارند، هر فرآیند 1 مگابایت در PSS دریافت می کند)
- اندازه مجموعه منحصربهفرد (USS): تعداد صفحات غیر اشتراکگذاری شده مورد استفاده برنامه (صفحات اشتراکگذاری شده شامل نمیشود)
PSS زمانی برای سیستم عامل مفید است که میخواهد بداند چه مقدار حافظه توسط همه فرآیندها استفاده میشود، زیرا صفحات چندین بار شمارش نمیشوند. محاسبه PSS زمان زیادی می برد زیرا سیستم باید تعیین کند که کدام صفحات و بر اساس چند فرآیند به اشتراک گذاشته می شوند. RSS بین صفحات اشتراکگذاری شده و غیر اشتراکگذاری شده تمایز قائل نمیشود (محاسبه آن را سریعتر میکند) و برای ردیابی تغییرات در تخصیص حافظه بهتر است.
منابع اضافی
- مروری بر مدیریت حافظه
- فرآیندها و چرخه حیات برنامه
- درک میزان استفاده از حافظه اندروید - ارائه Google I/O
- حافظه و بازیهای Android - ارائه Google I/O
- دیمون قاتل با حافظه کم اندروید
برای شما توصیه می شود
- توجه: وقتی جاوا اسکریپت خاموش است، متن پیوند نمایش داده می شود
- زمان راه اندازی اپلیکیشن