检测App的内存占用和泄漏

原创 2015年11月18日 14:28:39

别以为Android程序是基于Java语言,有强大的垃圾回收机制,就完全不用担心内存问题,其实Android程序也要特别小心你的内存,因为毕竟手机不比PC机,内存是极其有限的,在内存不够的时候,系统随时会Kill掉你的程序。目前我所了解到的,容易发生内存问题的地方如下:

(1) 操作Bitmap对象,一定要注意,在不使用的时候 recycle

(2) 访问数据库,一定要记得关闭游标

(3) 涉及JNI层的代码,由于JNI层是采用C/C++编写,需要自己管理内存的分配/回收,所以要慎重小心。

那么,Android开发中,有什么有效的方法可以检测内存使用情况以及内存泄漏呢?

这里主要介绍三种方法:

1. 程序的Log信息

程序在进行垃圾回收的时候,会打印一条Log信息(logcat窗口),例如:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

注意这条信息中的 “ 3571K/9991K” 值,这代表着程序使用的heap大小,如果这个值一直在增加,而从来不减小,那么就代表着你的程序存在着内存泄漏。

2. DDMS的Heap信息

Eclipse开发环境还提供了一种更加直观的方法来查看App的Heap信息,操作方式如下:

Android开发实践:检测App的内存占用和泄漏

(1)  连接手机,运行程序,假设是 com.ticktick.test 程序

(2)  点击DDMS按钮,在左侧的Device窗口选中你要检测的程序(com.ticktick.test )

(3)  点击Device窗口工具栏的第二个图标(Update Heap),

(4)  点击右边的窗口的Cause GC按钮,即可得到当前程序的Heap信息

同样,随着程序的运行,多次点击得到的Heap大小,如果只增不减的话,也昭示着你的程序有内存泄漏。

3.  adb命令查看内存信息

其实,最全面最简单的方式还是用adb命令来查看程序的内存占用和内存泄漏情况,打开命令行窗口,adb命令的格式如下:

adb shell dumpsys meminfo <package_name>

其中,package_name 也可以换成程序的pid,pid可以通过 adb shell top | grep app_name 来查找,在命令行窗口运行上述命令,得到的我的 com.ticktick.test 程序的内存情况如下所示:

Android开发实践:检测App的内存占用和泄漏

这里得到的信息非常多,重点关注如下几个字段:

(1) Native/Dalvik 的 Heap 信息

具体在上面的第一行和第二行,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值一直增长,则代表程序可能出现了内存泄漏。

(2) Total 的 PSS 信息

这个值就是你的应用真正占据的内存大小,通过这个信息,你可以轻松判别手机中哪些程序占内存比较大了。

4.  总结

关于Android开发中内存的使用情况和内存泄漏的检测就简单介绍到这里,基本上用以上三种方式都能够定位内存泄漏问题,平时在使用Bitmap,数据库和JNI层C/C++编程的时候,注意一点就行。另外,如果想深入了解文中的一些详细内容,可以参考Google官方提供的两篇文章,它们有着更详细的论述《Investigating Your RAM Usage》,《Managing Your App Memory》,有任何疑问或者不清楚的地方,

Android APP内存泄漏分析

Activity内部类泄漏 Activity如果存在内部类,无论是匿名内部类,或者是声明的内部类,都有可能造成Activity内存泄漏,因为内部类默认是直接持有这个activity的引用,如果内部类的...
  • lhd201006
  • lhd201006
  • 2016年11月05日 16:11
  • 977

app开发过程中内存泄漏一些简述_懂了这些你的app还在闪退么?

第一次写blog作为一个小菜的我还是略显压力,希望各位前辈多多提提建议.下面我们就开门见山了,作为一枚屌丝程序猿我表示在开发路上最痛苦的事情莫过内存问题了,什么点着点着越来越卡,什么点着点着直接挂掉…...
  • Autism_mimi
  • Autism_mimi
  • 2015年12月29日 15:46
  • 1340

内存泄露Demo leaky app

  • 2012年11月28日 11:25
  • 22KB
  • 下载

App内存泄漏问题

一、Java内存泄漏 1、主要原因Activity(静态引用)、Dialog在onDestroy时没有被dismiss等。 2、分析工具: MAT产生的hrof文件查看引用链,断掉就OK。 AOP在o...
  • a345017062
  • a345017062
  • 2013年01月18日 20:46
  • 6396

Android App 内存泄露之调试工具(1)

Android App 内存泄露之工具(1) 使用内存监测工具 DDMS –> Heap 操作步骤 启动eclipse后,切换到DDMS透视图,并确认Devices视图、Heap视图都是...
  • zhuanglonghai
  • zhuanglonghai
  • 2014年08月08日 16:49
  • 6121

APP运行占用内存分析

对于手机来说,运行内存还是挺珍贵的,因此,如果你的APP能够占用尽量少的内存,无疑会更加受用户欢迎。下面说说APP运行时占用内存的分析: 测试方法: 一、使用Android Studio自带的工具...
  • chencangui
  • chencangui
  • 2015年09月13日 21:34
  • 2035

App 内存泄漏二三事

AFHTTP 内存泄漏问题这是 AFHTTP 框架的通病。这个问题很常见,也最好解决,网上也有不少的解决方案。主流的解决方案就是使用单例。定义一个单例对象 SessionManager:@interf...
  • kmyhy
  • kmyhy
  • 2017年06月02日 17:33
  • 1056

常见的八种导致 APP 内存泄漏的问题

http://blog.csdn.net/calvin_zhou/article/details/51516978 http://blog.csdn.net/calvin_zhou/articl...
  • u011904605
  • u011904605
  • 2016年12月11日 16:07
  • 118

App性能测试前需要了解的内存原理

这两天在研究性能中内存方面的一块,网上也零散看了挺多文章,写得很细但是感觉不够整体,所以这篇算是总结一下吧,当个复习资料。 那么这里个人分为两个大部分,第一部分应用内的内存管理,主要是oom的理...
  • Cloud_Huan
  • Cloud_Huan
  • 2016年04月13日 19:49
  • 2363

Android APP专项测试整理-内存及cpu

命令: adb shell dumpsys meminfo  packagename 关注点:  1.Native/Dalvik 的 Heap 信息 具体在上面的第一行和第二行,它分别给出的是JNI层...
  • u011649536
  • u011649536
  • 2017年01月04日 17:26
  • 1339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:检测App的内存占用和泄漏
举报原因:
原因补充:

(最多只允许输入30个字)