如何分析Android应用内存使用情况

如何分析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上很多文章都有介绍检测的步骤。如这篇文章,点击打开链接

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值