android 快速定位内存泄露位置技巧

众所周知,android有垃圾回收机制,在android开发过程中我们不需要去关注内存问题,但是在某些情况下还是会出现内存泄露,在我的工作过程中出现内存泄露的主要原因是因为static变量引起的,然后static变量和其他变量进行相互引用,最终引用到了activity,所以会导致activity退出了但是不能被销毁,从而activity中的view和图片也不能被销毁,极大的消耗了系统内存.经过查找资料和自我分析,个人得出一下分析技巧(以乐视TV版为例,感觉很实用):
利用到的工具和命令如下:
1.adb shell dumpsys meminfo  com.letv.tv
2.Mat工具(Memory analysis tool)

分析过程:
首先打开TV版应用,随机打开几个页面,然后回到首页,在利用ddms进行手动gc一下,然后利用adb shell dumpsys..这个命令得到如下信息
Applications Memory Usage (kB):
Uptime: 2667972 Realtime: 2667972

** MEMINFO in pid 31769 [com.letv.tv] **
                         Shared  Private     Heap     Heap     Heap
                   Pss    Dirty    Dirty     Size    Alloc     Free
                ------   ------   ------   ------   ------   ------
       Native        0        0        0    10520     9999      124
       Dalvik    70818     4564    70692    67984    65377     2607
        Stack       32        4       32                           
       Cursor        0        0        0                           
       Ashmem        0        0        0                           
    Other dev        4       36        0                           
     .so mmap     3793     2936     2548                           
    .jar mmap        0        0        0                           
    .apk mmap      271        0        0                           
    .ttf mmap       52        0        0                           
    .dex mmap     4076        4       24                           
   Other mmap     1457        8        8                           
      Unknown     7172      396     7164                           
        TOTAL    87675     7948    80468    78504    75376     2731
 
 Objects
               Views:     2091         ViewRootImpl:        1
         AppContexts:        5           Activities:        1
              Assets:        2        AssetManagers:        2
       Local Binders:       17        Proxy Binders:       28
    Death Recipients:        4
     OpenSSL Sockets:        1
 
 SQL
         MEMORY_USED:      108
  PAGECACHE_OVERFLOW:       24          MALLOC_SIZE:       62
 
 DATABASES
      pgsz     dbsz   Lookaside(b)          cache  Dbname
         4       20             97         4/19/5  /data/data/com.letv.tv/databases/letv.sqlite

我们主要看activities这个数值,如果activity的数量大于1,就存在activity内存泄露,我们可以看到当前只有一个activity存在,所以就不存在activity的泄露.如果存在,我们就利用ddms获取hprof文件,然后经过android sdk中的工具进行转换,得到可以用mat打开的hprof文件,然后过滤出activity对象,然后得到引用路径,一步步查找即可得到内存泄露的真正原因.

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值