内存用量(匿名 RSS + 交换空间)是一项反映应用内存用量的指标。
匿名内存是指没有存储器中的文件支持的内存,例如堆分配和 mmap 分配的内存。此选项可捕获应用的动态内存分配,包括 Java 或 Kotlin 堆、非托管原生堆分配(在 Android 8.0 [API 级别 26] 及更高版本中,位图像素数据就存储在此处)和线程执行堆栈。虽然操作系统可以在压力下丢弃有文件支持的内存,但无法丢弃匿名内存。
常驻内存大小 (RSS) 是进程使用的(共享和非共享)内存页的总数,这些内存页保存在物理 RAM 中。如果某个内存页被多个进程(例如访问同一库的应用)访问,则该内存页被视为“共享”。
对于匿名内存,当内存面临压力时,系统可以将页面写入交换空间(或 Android 上的 zRAM)。如果需要,系统可以从交换区读回这些页面。
总而言之,内存用量(匿名 RSS + 交换空间)衡量的是应用在存储空间中没有文件支持的内存页总数,包括系统在交换空间中保留的任何内存。跟踪匿名 RSS + 交换空间可确保您看到应用真实且无法逐出的内存占用。
如果应用的内存用量较高,请使用本页中的指南进一步调查并解决问题。
资源
在本地诊断内存用量过高的问题
如需开始诊断内存用量过多的原因,您可以使用开发者设置中的记录堆转储、Android Studio 或 Perfetto 捕获堆转储。建议您先在本地捕获堆转储,然后再测试应用的核心用户体验历程。
我们尤其建议您测试以下用户历程:
- 网页视图和应用内浏览器会话
- 包含大量媒体内容的无限滚动
- 素材资源创建和修改流程
为了调查潜在的内存泄漏问题,请在本地运行相应的用户历程,并收集不同进程状态(可见、前台服务和缓存)下的堆转储,以验证应用在转入后台后是否会释放内存。如需了解这些进程状态如何与 onTrimMemory 回调相关联,请参阅有关响应事件释放内存的指南。
如果您使用 Android Studio 性能分析器调试内存问题,还可以使用 LeakCanary 集成来简化泄漏和重复位图检测,从而优化图片使用情况。
收集堆转储后,我们建议您使用 Android 性能分析器技能来分析堆转储,并找出可能导致内存用量过高的来源。
Android skills
在 GitHub 上查看Android 性能分析器
android skills add android-profiler以下是 AI 技能可能会给出的回答示例:
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 堆转储浏览器指南,了解如何在 Perfetto 界面中浏览和解读堆转储可视化图表。
- Java/Kotlin 分配:如需逐步了解如何分析 Android 运行时 (ART) 堆转储,请参阅直观呈现您的第一个 ART 堆转储。
- 原生分配:请参阅 Perfetto 原生性能分析文档,了解如何收集和分析原生 (C/C++) 内存性能剖析。
- CLI 检查:使用 adb dumpsys meminfo 快速了解应用在设备上的内存使用情况。
提高内存用量
请参阅以下部分,详细了解如何改进应用的内存用量:
如需有关修复内存问题的详细指南,请参阅管理应用内存指南。