میزان استفاده از حافظه (RSS ناشناس + swap) معیاری در Android Vitals است که میزان استفاده از حافظه توسط برنامه شما را نشان میدهد.
حافظه ناشناس ، حافظهای است که توسط فایلی در حافظه پشتیبانی نمیشود، مانند تخصیصهای هیپ و حافظه تخصیصیافته توسط mmap. این حافظه، تخصیصهای حافظه پویای برنامه شما، از جمله هیپ جاوا یا کاتلین، تخصیصهای هیپ بومی مدیریتنشده (جایی که دادههای پیکسلی بیتمپ در اندروید ۸.۰ (سطح API ۲۶) و بالاتر وجود دارد) و پشتههای اجرای نخ را ثبت میکند. در حالی که سیستم عامل میتواند حافظه فایل-پشتیبانیشده را تحت فشار رها کند، نمیتواند حافظه ناشناس را رها کند.
اندازه مجموعه مقیم (RSS) تعداد کل صفحات حافظه (اعم از مشترک و غیر مشترک) است که توسط یک فرآیند که در RAM فیزیکی نگهداری میشوند، استفاده میشود. یک صفحه در صورتی «مشترک» در نظر گرفته میشود که توسط بیش از یک فرآیند (مانند برنامههایی که به یک کتابخانه دسترسی دارند) مورد دسترسی قرار گیرد.
برای حافظه ناشناس، سیستم میتواند وقتی حافظه تحت فشار است، صفحاتی را در فضای swap (یا zRAM در اندروید) بنویسد. سیستم میتواند در صورت نیاز این صفحات را از swap بخواند.
در مجموع، میزان استفاده از حافظه (RSS ناشناس + swap) معیاری از تعداد کل صفحات حافظه برنامه شما است که توسط فایلی در فضای ذخیرهسازی پشتیبانی نمیشوند، از جمله هر حافظهای که توسط سیستم در swap نیز حفظ میشود. ردیابی RSS ناشناس + swap تضمین میکند که ردپای واقعی و غیرقابل حذف حافظه برنامه خود را ببینید.
اگر میزان مصرف حافظه برنامه شما زیاد است، بیشتر بررسی کنید و با استفاده از راهنماییهای این صفحه، مشکل را برطرف کنید.
شناسایی مصرف بالای حافظه
نکات مهم اندروید
Android Vitals میزان استفاده از حافظه برنامه شما را که توسط فرآیندهای زیر تفکیک شده است، به اشتراک میگذارد:
- Foreground : The app's process is visible. High P99 here often affects user-perceived performance (jank or OOM crashes) and is heavily driven by unevicted UI components or activities.
- سرویس پیشزمینه : برنامه در حال اجرای یک سرویس پیشزمینه است. از آنجا که این سرویسها برای وظایف طولانیمدت طراحی شدهاند، کاندیداهای اصلی نشتهای چرخه عمر تجمعی هستند که به مرور زمان دم P99 را به شدت افزایش میدهند.
- پسزمینه : برنامه در حال اجرای یک سرویس پسزمینه است، یا اخیراً در پسزمینه قرار گرفته، اما هنوز در حافظه پنهان (cache) ذخیره نشده است. اینجاست که نشت پردازش پسزمینه تشدید میشود.
- ذخیره شده (Cached ): برنامه در حالت ذخیره شده (cache) قرار دارد. این حالت به فشار حافظه سیستم مانند LMKها بسیار حساس است. از آنجا که سیستم عامل میتواند این حالت فرآیند را به دلخواه حذف کند، این حالت فقط برای اهداف اشکالزدایی ارائه میشود.
برای درک چگونگی ارتباط این وضعیتهای فرآیند با فراخوانیهای onTrimMemory ، به راهنمای آزادسازی حافظه در پاسخ به رویدادها مراجعه کنید.
Android Vitals همچنین میزان استفاده از حافظه برنامه شما را بر اساس RAM تفکیک میکند. معیار استفاده از حافظه به صورت یک جدول زمانی از مقادیر صدک روزانه، در کنار جدیدترین مقدار روزانه برای صدکهای ۵۰ و ۹۰ نمایش داده میشود.
پس از شناسایی خط پایه حافظه خود، برای تشخیص و بهبود استفاده بیش از حد از حافظه، راهنماییها را دنبال کنید.
شناسایی نشت حافظه با استفاده از tail skew
برای کمک به شناسایی نشت حافظه، به دنبال واگرایی بین کاربران معمولی (P50) و کاربران انتهایی (P90) خود در دادههای حیاتی اندروید باشید. در حالی که نفخ کلی دارایی، حافظه را به طور یکنواخت در تمام صدکها افزایش میدهد، نشت حافظه با گذشت زمان تشدید میشود و دادههای انتهایی را به شدت منحرف میکند.
شما باید معیارهای P90 و P99 خود را با P50 پایه خود بر اساس نام فرآیند مقایسه کنید. اگر نسبت P90 به P50 شما از 3.5 برابر بیشتر شود، نشان دهنده نشت حافظه احتمالی در طول جلسات طولانی است. برای موارد استفاده خاص، نسبت بالا همیشه نشان دهنده نشت نیست، اما شما باید گردش کار خاص را ارزیابی کنید تا مشخص شود که آیا افزایش استفاده از حافظه، رفتار مورد انتظار است یا خیر.
منابع
تشخیص استفاده بیش از حد از حافظه به صورت محلی
To get started with diagnosing the source of excessive memory usage, you can capture a heap dump with Record heap dump in developer settings, Android Studio , or Perfetto . We recommend you start by capturing a heap dump locally after testing your app's core user journeys.
ما به ویژه توصیه میکنیم مسیرهای کاربری زیر را آزمایش کنید:
- وب ویوها و جلسات مرورگر درون برنامهای
- پیمایش بینهایت پر از رسانه
- جریانهای ایجاد و ویرایش دارایی
برای بررسی نشت حافظه احتمالی، ابتدا فرآیندهایی که بیشترین مصرف را دارند را با استفاده از جدول نام فرآیند در داشبورد استفاده از حافظه Android Vitals شناسایی کنید. در مرحله بعد، مسیرهای کاربری مربوطه را به صورت محلی اجرا کنید و دادههای هیپ را در حالتهای مختلف فرآیند (قابل مشاهده، سرویس پیشزمینه و ذخیره شده) جمعآوری کنید تا بررسی کنید که آیا برنامه پس از قرار گرفتن در پسزمینه، حافظه را آزاد میکند یا خیر.
اگر با استفاده از Android Studio Profiler در حال اشکالزدایی مشکلات حافظه هستید، میتوانید از ادغام LeakCanary نیز برای سادهسازی تشخیص نشت و تشخیص بیتمپ تکراری استفاده کنید تا استفاده از تصویر خود را بهینه کنید .
پس از جمعآوری دادههای هیپ، توصیه میکنیم از Perfetto AI Skills برای تجزیه و تحلیل هیپ و شناسایی منابع بالقوهی مصرف بالای حافظه استفاده کنید.
در اینجا مثالی از آنچه مهارتهای هوش مصنوعی میتوانند پاسخ دهند، آورده شده است:
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 استفاده کنید.
- تخصیصهای جاوا/کاتلین: برای آشنایی گام به گام با تحلیل دادههای هیپ زمان اجرای اندروید (ART) ، بخش «تصویرسازی اولین هیپ دامپ ART» را مطالعه کنید.
- تخصیصهای بومی: برای یادگیری نحوه جمعآوری و تحلیل پروفایلهای حافظه بومی (C/C++) به مستندات Perfetto Native Profiling مراجعه کنید.
- بازرسی رابط خط فرمان (CLI): از adb dumpsys meminfo برای دریافت خلاصهای سریع از میزان استفاده از حافظه برنامه خود در دستگاه استفاده کنید.
- تحلیل با کمک هوش مصنوعی: از مهارتهای هوش مصنوعی Perfetto برای اجرای تحلیلهای مبتنی بر LLM استفاده کنید تا به تشخیص نشت حافظه و تخصیص بیش از حد در ردیابیهای خود کمک کنید.
- تحلیل مبتنی بر SQL: از Perfetto SQL و مهارتهای تحلیل ردیابی برای اجرای پرسوجوهای ساختاریافته و اسکریپتهای تخصصی برای تحلیل دادههای ردیابی پیچیده استفاده کنید.
بهبود استفاده از حافظه
برای کسب اطلاعات بیشتر در مورد بهبود استفاده از حافظه برنامه خود، به این بخشها مراجعه کنید:
- کاهش حجم کد و منابع برنامه شما
- نظارت بر حافظه موجود و میزان استفاده از حافظه
- از ساختارهای کد با بهرهوری بیشتر در حافظه استفاده کنید
برای راهنمایی دقیق در مورد رفع مشکلات حافظه، به راهنمای مدیریت حافظه برنامه خود مراجعه کنید.