如何分析Android应用内存使用情况
在开发Android应用的时候,我们应该尽量少的使用内存资源,尽量避免引入内存泄漏或其他内存问题。其实,应用存在一些内存相关的问题是不可避免的。所以,我们需要使用一些工具来分析确定这些问题。当然,万能的Google已经为我们提供了很多的工具:
Dalvik日志信息
最简单的方法是通过查看Dalvik日志信息,这些日志可以通过工具logcat查看:
D/dalvikvm(pid):<GC_Reason>,<Amount_freed>,<Heap_stats>,<External_memory_stats>,<Pause_time>
下面解释一下上述日志格式中每个字段的含义:
GC reason:触发这次的原因以及GC的种类;
Amount freed:这次GC回收的堆内存的大小;
Heap stats:空闲堆内存的百分比以及(活动对象的个数)/(堆内存的总大小);
External memory stats:外部的内存分配(API级别 <= 10),内存的分配量/发生这次GC的内存限制值
Pause time:堆内存越大,产生的暂停时间越长。因为并发(GC_CONCURRENT)GC导致的暂停时间有两次:一次是GC开始的时候以及当GC快结束的时候。
D/dalvikvm(24258): GC_CONCURRENT freed 1996K, 28% free 24467K/33671K, paused 33ms+19ms, total 320ms
我们看一下具体的例子,如上所示,通过分析这一类的日志信息(可通过dalvikvm关键字+pid去过滤),特别需要注意heap stats字段(24467K/33671K,如上所示)中的数值是否有上升,如果,这个字段的值持续上升且重来没有变小,那么应用可能发生了内存泄漏。
从上面的叙述可以看出,Dalvik执行GC会产生pause time,显然这个肯定会有性能上的影响,这个从一定程度上可以回答——为什么Android设备内存吃紧的时候,会有卡顿的感觉(GC导致ANR)。所以,我们也看一下发生GC的几种原因/种类:
GC_CONCURRENT:由于应用的堆内存剩余空间不足时,会导致一次并发的GC并开始释放应用的内存;
GC_FOR_MALLOC:由于应用在堆内存空间已满的情况下,仍然尝试分配内存,那么系统不得不终止你的应用并回收应用;
GC_HPROF_DUMP_HEAP:当你创建一个HPROF文件分析你的堆内存时,会发生一次GC;
GC_EXPLICIT:一次显示的GC,例如调用gc() (当然,应该尽量避免直接调用,而是让垃圾回收器去处理GC);
GC_EXTERNAL_ALLOC:这类GC只会在API低于10的版本中才会出现。
内存检测工具
目前开发流行的检测主要分两种。
1.功能强大PC端检测工具,如MemoryAnalyzer运行在PC端抓取Android手机中的dump文件进行深度分析。
2.小而优的Android端检测工具,如LeakCanary随App一起安装会在Android手机桌面安装的内存泄露检测App
这里我就不过多阐述,CSDN上很多文章都有介绍检测的步骤。如这篇文章,点击打开链接。