内存分析是Profiler中的一个组件,可以帮助我们识别可能会导致应用卡顿、冻结甚至崩溃的内存泄露和内存抖动。可以显示应用内存使用情况实时图表,帮助我们捕获堆转储、强制执行垃圾回收以及跟踪内存的分配情况。
打开内存分析步骤: 1、依次点击View→Tool Window→Profiler 2、从Profiler工具栏中选择要分析的设备以及应用进程。(需要优先确保设备通过USB正常连接IDE) 3、点击MEMORY时间轴上的任意位置可以打开内存分析。
一、分析应用内存的目的
当应用存在不再使用的某些对象时,垃圾回收器会将未使用的内存释放。如果应用分配内存的速度比系统回收的速度快时,回收器要释放足够的内存来满足应用的分配需要时,应用可能会产生延迟,从而可能导致应用跳帧,使应用明显变慢。 即使应用使用过程中未表现出变慢,但如果存在内存泄漏,应用挂在后台运行时,依然会保留相应的内存。从而导致系统强制执行不必要的垃圾回收时间,从而拖慢系统其余部分的内存性能,最终使系统被迫终止应用进程以回收内存。致使用户返回应用时,必须重启。影响到用户体验。 因此可以通过以下几种操作从而防止这些问题: 1、在时间轴上查找可能会导致性能问题的不理想内存分配进行查看; 2、转储java堆以便查看在任何给定时间内有哪些对象在占用内存。在一个较长的时间段内进行多次堆转储有助于分析内存泄漏点,常用该种方式检测; 3、记录正常与极端情况下用户交互期间的内存分配情况。从而准确识别代码中可能存在的短时间内分配过多对象而出现泄漏的情况。
二、Profiler概览
打开Profiler后,选择设备以及应用,则可以看到时间轴界面,其中包含CPU、MEMORY、ENERGY的情况。其中MEMORY为内存分析器、ENERGY为电池分析器; 其中我们主要是用内存分析器工具。
当中有三项选择:Capture heap dump:获取堆转储,该为目前主要检测手段,稍后讲解; Record native allocations:获取设备上录制原生分配情况; Record Java/Kotlin allocations:获取录制Java和Kotlin分配情况;
三、查看内存分配情况
1、内存分配情况表可以显示内存中每个java对象和JNI引用的分配方式。因此,内存分析器可以显示有关对象分配情况信息如下: --分配了哪些类型的对象以及他们使用了多少空间; --每个分配堆栈的轨迹,包括在哪些线程中; --对象何时被取消分配等; 如果需要中Android 10以及更高版本的设备上录制原生分配情况,需要选择Record native allocations,然后点击Record,录制会持续到点击Stop为止,之后内存分析界面会转换到显示原生录制的屏幕中。
注意:低于android10,record native allocations选项不可使用。
如果需要录制java和kotlin分配情况,请选择record java/kotlin allocations,然后选择record。如果设备搭载的是android8+,则内存分析将可以转换显示就行录制的界面,可以按紧选中某一块区域进行查看。
四、捕获堆转储
堆转储显示捕获堆转储时应用中对象正在使用的内存,尤其是在长时间的操作中,堆转储会显示认为不应该再存在的内存对象,从而帮助识别内存泄漏。 如果需要捕获堆转储,需要选择capture heap dump,然后选择record。一段时间后,就会生成heap dump,可进行查看,也可以通过第三方工具Memory Analyzer进行查看。
由于新版IDE剔除了Memory Analyzer工具,因此,目前查看需要通过eclipse中的插件工具memory analyzer进行查看。可通过工具下载进行试验:http://www.eclipse.org/mat/downloads.php
通过工具打开phrof文件,进入主界面
点击leak suspects可查看疑似内存泄漏的地方,点击detail可以查看分析出ArryList存放对象Person出了问题。
也可以在overview中点击dominator_tree查看堆占比,可以看出一个线程占比过高,集合中对象的数量过多等。