android 内存泄漏分析技能
java虚拟机运行一般都有一个内存界限,超过这个界限,就会报outofmemory。这个时候一般都是存在内存泄漏。解决内存泄漏问题,窃以为分为两个步骤:分析应用程序是否真的有内存泄漏,找到内存泄漏的地方。这两个步骤都不是一般意义上的调试,直接打log,断点调试都不是太给力。动脑筋想一想,内存问题应该在很多地方上都会出现,这么常见的问题应该是有工具的。android现在更可以说是一个生态系统,当然也有很多开发辅助工具。在前面的两个步骤中都有很强大的武器,熟练的掌握这些利器,分析问题就会事半功倍。
分析是否有内存泄漏一:adb shell dumpsys meminfo package_name(adb shell dumpsys meminfo pid)
如上图所示,可以直接看出当前应用的内存占用情况。大多数情况下,我们都是关心第一二两行的一二两列。如果我们怀疑某个界面有内存泄漏的情况,就可以通过以下方法来判断。重复的执行这个步骤多次,然后看一下执行前后内存占用情况。如果内存有明显的增长,并且一段时间内没有恢复,基本就可以确认代码中有内存泄漏的地方。
分析是否有内存泄漏二:DDMS实时查看,注意要在DDMS上显示系统所有进程,这个需要手机有root权限。
选中要分析的进程,进入heap界面,点击Cause GC按钮,之后这个界面会定时刷新。一般只要关注data Object这一行,这个也就是我们的对象占用的内存。java的内存泄漏就是对象使用完没有及时释放导致不能被GC。关注data Object一般直接关注total Size,根据这个值的大小增长来判断当前是否有内存泄漏。同样在一段时间内重复操作某个动作,观察data Object的total Size有木有明显的增长。
上面的两个方法都是分析应用有木有内存泄漏的问题,主要思想都是重复某一个操作,看看内存有没有明显增长,并且没有恢复。正常的应用都会稳定在一个小的范围内,有问题的应用一般都是持续增长,很难恢复。两个工具中,一个是手动刷新,一个是自动刷新,相比较而言,笔者推荐第一个方法。人工控制,感觉更好。
发现应用存在内存泄漏是不够的,我们最终目的是解决问题。这个时候就需要找到内存泄漏的地方。Eclipse已经为我们提供了强大的内存分析工具MAT,下载地址是:http://www.eclipse.org/mat/。使用这个工具之前,先要生成一个记录进程内存分部情况的HPROF文件,然后使用MAT来分析内存的占用情况。DDMS上有个DUMP HPROF FILE的按钮,这个就可以直接生成HPROF文件。
如果eclipse上已经安装了MAT插件,生成的同时也就打开了这个文件。不过个人喜欢将MAT单独使用,感觉更快捷更方便。MAT打开了HPROF文件之后,就能显示当前内存占用图。
从这个图中的圆形图片就能看出当前哪些地方占用的内存最多。一般内存泄漏都是在这几个地方。图中有个leak suspects的链接,点击就能查看详情了,能看到哪些对象占用了内存。如果某个类有太多的对象,基本上就这个类产生的内存泄漏,找到分配对象的地方,很快就能找到哪里逻辑不健壮,使用完之后没有及时释放内存。
分析内存泄漏,找到修改地方都是一剂良药,能一开始就就注意避免后续的分析才是最好的。
- 1楼log2254小时前
- 能不能讲讲这个工具的详细使用?
- android 读取byte[]中的元素解决方案
- android 标题栏兑现方式
- android 中Activity向BroadcastReceiver发送数据,该怎么解决
- Android 4.0 为什么模拟器老是提示小弟我谷歌拼音输入法已停止
- android:getSharedPreferences() 这是哪个类的方法解决思路
- android 怎么判断一个程序是否联网
- android 大量数据按周分组,该如何解决
- android RadioButton如何设置默认选中
- ksoap2-android-这个包,连接webService怎么设置超时
- android 怎么重新设置锚点
- android UI界面设计解决方案
- android 图片对象获取的有关问题
- android 怎么调用淘宝支付宝接口
- Android 沿袭InputMethodService自定义输入法
- android 关于服务连接的疑义
- android 两个activity如何通信
- android 怎么实现对view的放大和缩小
- android 教程解决方法
- android ID,该如何处理
- 准备复习2-3个月,看java+android,请问有经验者,怎么看效果最好》
- android UI线程与AsyncTask的有关问题
- android(java)中的java.net能不能和c#的system.net.sockets进行tcp通信,该如何解决
- android ListView 中的onItemClick Intent 没法跳转
- android(java) 中文乱码的有关问题
- c#c++,android,ios(iphone),php,java视屏课程 散分
- android Post文件到ASP.NET的有关问题,能收到参数收不到文件
- RIM 替 Android 开发者提供免费的 PlayBook!2月13日前
- android 动态设立控件高度
- Android test project 编译方法
- android -相机使用教程(1)解决方法