Memory Profiler是Android Profiler中的一个组件,它可以帮助您识别内存泄漏和可能导致卡顿、冻结甚至应用程序崩溃的内存抖动。它显示一个应用程序内存使用的实时图表,并允许你抓取堆栈信息、强行垃圾收集和跟踪内存分配。
要打开Memory Profiler,请执行以下步骤:
单击View > Tool Windows > Profiler(也可以单击工具栏中的Profile图标)。
从Android Profiler工具栏中选择要分析的设备和应用程序进程。如果已通过USB连接设备,但未看到列出的设备,请确保已启用USB调试。
单击MEMORY时间轴中的任意位置打开Memory Profiler。
为什么要分析应用程序内存
Android提供了一个托管内存环境,当它确定应用程序不再使用某些对象时,垃圾收集器会将未使用的内存释放回堆中。Android寻找未使用内存的方式正在不断改进,但在所有Android版本中,系统必须短暂暂停代码。大多数时候,停顿是不被感知的。但是,如果应用程序分配内存的速度快于系统回收内存的速度,则应用程序可能会发生延迟,等待回收器释放足够的内存以满足分配。延迟可能导致应用程序发生跳帧并导致明显变慢。
即使你的应用程序并没有表现出缓慢,但如果它泄露了内存,即使运行在后台也可以占用内存。此行为会导致垃圾回收事件被强制执行,从而降低系统的其余内存性能。最后,系统可能被迫终止应用程序进程以回收内存。因此当用户返回到此应用程序时,它必须完全重新启动。
为了帮助防止这些问题,您应该通过以下操作使用Memory Profiler进行检查:
在时间轴中查找可能导致性能问题的不良内存分配模式。
抓取Java堆来查看在任何给定时间哪些对象正在耗尽内存。在一段较长的时间内多次抓取堆信息有助于识别内存泄漏。
记录正常和极端的用户交互过程中的内存分配,以确定代码在短时间内分配过多对象的位置或对象泄漏的位置。
Memory Profiler概述
当您第一次打开Memory Profiler时,您将看到应用程序的内存使用的详细时间轴,和可以使用的内存工具包括强制垃圾回收、抓取堆信息和记录内存分配。
如上图所示,Memory Profiler的默认视图包括以下内容:
强制垃圾回收事件的按钮。
抓取堆信息的按钮。注意:仅当连接到运行Android7.1(API级别25)或更低版本的设备时,堆信息按钮右侧才会显示一个用于记录内存分配的按钮。
用于设置Profiler捕获内存分配的频率的下拉菜单。选择适当的选项可以帮助您在分析时提高应用程序性能。
用于放大/缩小时间轴的按钮。
一个跳转到实时内存数据的按钮。
事件时间轴,显示活动状态、用户输入事件和屏幕旋转事件。
内存使用时间轴,包括以下内容:
由每一个内存类别使用多少内存的堆叠图,如左边的Y轴和顶部的颜色键所指示的。
虚线表示分配的对象的数目,如右边的y轴所示。
每个垃圾回收事件的图标。
但是,如果您使用的是运行Android 7.1或更低版本的设备,默认情况下并非所有分析数据都可见。如果您看到一条消息,上面写着“Advanced profiling is unavailable for the selected process”,则需要启用高级分析才能看到以下内容:
事件时间轴
分配的对象数
垃圾回收事件
在Android 8.0及更高版本上,高级分析在可调试的应用程序上始终开启。
如何计算内存
你在Memory Profiler顶部看到的数字基于您的应用通过Android 系统提交的所有私有内存页面。此计数不包括与系统或其他应用程序共享的页面。