java虚拟机执行一般都有一个内存界限,超过这个界限,就会报outofmemory。这个时候一般都是存在内存泄漏。解决内存泄漏问题,窃以为分为两个步骤:分析应用程序是否真的有内存泄漏,找到内存泄漏的地方。这两个步骤都不是一般意义上的调试,直接打log,断点调试都不是太给力。动脑筋想一想,内存问题应该在非常多地方上都会出现,这么常见的问题应该是有工具的。android如今更能够说是一个生态系统,当然也有非常多开发辅助工具。在前面的两个步骤中都有非常强大的武器,熟练的掌握这些利器,分析问题就会事半功倍。

分析是否有内存泄漏一:adb shell dumpsys meminfo package_name(adb shell dumpsys meminfo pid)

如上图所看到的,能够直接看出当前应用的内存占用情况。大多数情况下,我们都是关心第一二两行的一二两列。假设我们怀疑某个界面有内存泄漏的情况,就能够通过下面方法来推断。反复的运行这个步骤多次,然后看一下运行前后内存占用情况。假设内存有明显的增长,而且一段时间内没有恢复,基本就能够确认代码中有内存泄漏的地方。

        分析是否有内存泄漏二:DDMS实时查看,注意要在DDMS上显示系统全部进程,这个须要手机有root权限。

选中要分析的进程,进入heap界面,点击Cause GCbutton,之后这个界面会定时刷新。一般仅仅要关注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的button,这个就能够直接生成HPROF文件。

        假设eclipse上已经安装了MAT插件,生成的同一时候也就打开了这个文件。只是个人喜欢将MAT单独使用,感觉更快捷更方便。MAT打开了HPROF文件之后,就能显示当前内存占用图。

从这个图中的圆形图片就能看出当前哪些地方占用的内存最多。一般内存泄漏都是在这几个地方。图中有个leak suspects的链接,点击就能查看详情了,能看到哪些对象占用了内存。假设某个类有太多的对象,基本上就这个类产生的内存泄漏,找到分配对象的地方,非常快就能找到哪里逻辑不健壮,使用完之后没有及时释放内存。

分析内存泄漏,找到改动地方都是一剂良药,能一開始就就注意避免兴许的分析才是最好的。

android 内存泄漏分析技巧的更多相关文章

  1. Android 内存泄漏分析与解决方法

    在分析Android内存泄漏之前,先了解一下JAVA的一些知识 1. JAVA中的对象的创建 使用new指令生成对象时,堆内存将会为此开辟一份空间存放该对象 垃圾回收器回收非存活的对象,并释放对应的内 ...

  2. Android内存泄漏分析实战

    内存泄漏简单介绍 java能够保证当没有引用指向对象的时候,对象会被垃圾回收器回收.与c语言自己申请的内存自己释放相比,java程序猿轻松了非常多.可是并不代表java程序猿不用操心内存泄漏.当jav ...

  3. Android内存泄漏分析及调试

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...

  4. (转)Android内存泄漏分析及调试

      http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析  首先了解一下dalvik的Ga ...

  5. Android内存泄漏分析

    周末去上海参加了安卓巴士组织的技术论坛,去了才发现自己基础很渣..... 其中提到了android的内存泄漏的问题,回来马上度娘(虽说度娘很渣),整理如下: 一.单例造成的内存泄漏 因为单例的静态特性 ...

  6. Android 内存泄漏分析利器——leakcanary

    LeakCanary Android 和 Java 内存泄露检测. “A small leak will sink a great ship.” - Benjamin Franklin 千里之堤, 毁 ...

  7. Android 内存管理分析(四)

    尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/8920039 最近在网上看了不少Android内存管理方面的博文,但是文章大多 ...

  8. Android内存泄漏的检测流程、捕捉以及分析

    https://blog.csdn.net/qq_20280683/article/details/77964208 Android内存泄漏的检测流程.捕捉以及分析 简述: 一个APP的性能,重度关乎 ...

  9. Android内存机制分析1——了解Android堆和栈

    //----------------------------------------------------------------------------------- Android内存机制分析1 ...

随机推荐

  1. HTML5 RPG游戏引擎 地图实现篇

    一,话说全国年夜事   前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...

  2. C 和 C++ 的速度相差多少,你知道吗?

    有谁清楚这个事实吗 ? 网络游戏速度至关重要, 是游戏质量的唯一标准, 尤其是即时格斗, 相差几毫秒都会影响用户体验 ! 哪怕就是 5% 的效率损失,也是 差之毫厘,失之千里, 游戏的速度是程序语言天 ...

  3. python中使用traceback来追踪异常

    test1.py中,当分母为0的时候,调用系统退出 #!/usr/bin/python import sys def division(a=1, b=1): if b==0: print 'b eq ...

  4. Socket规划(1)

    socket定义 于Linux网络编程是通过socket进行的. 人们常说的socket是一种特殊的I/O接口,他也是一个文件描写叙述符.socket是一种经常使用的进程之间通信机制,通过它不仅能实现 ...

  5. Linux下常用操作汇总

    查看linux操作系统位数 (1) 终端输入: file /sbin/init 如 显示: /sbin/init: ELF 32-bit LSB executable, Intel 80386, ve ...

  6. Quartz2D裁剪圆形头像

    // 0. 载入原有图片 UIImage *image = [UIImage imageNamed:icon]; // 1.创建图片上下文 CGFloat margin = border; CGSiz ...

  7. cer, pfx 创建,而且读取公钥/密钥,加解密 (C#程序实现)

    PKI技术(public key infrastructure)里面,cer文件和pfx文件是非经常见的.通常cer文件中面保存着公钥以及用户的一些信息,pfx里面则含有私钥和公钥. 用makecer ...

  8. 玩转Web之Json(三)-----easy ui怎么把前台显示的dataGird中的所有数据序列化为json,返回到后台并解析

    最近做一个项目时,需要在dataGird中插入<input>,即文本输入框,当点击提交时,需要把文本框里填的数据返以及其他列的一些信息以json数组的格式返回到后台,虽然我实现了该功能,但 ...

  9. SecureCRT使用提示

    一旦itpub我写上面,我不知道这个博客的背后,我们无法上传和修改内容.好恼火啊! 原文链接:SecureCRT的几个使用方法设置 在原文的基础上,再补充几个功能: 1.最好将全部设置定制在Globa ...

  10. hdu3182 状态压缩水题

    题意是这种     给你n个汉堡     每一个汉堡有它的价值   做每一个汉堡都得花费相应的能量      如今告诉你最大能量 让你求获得的最大的价值(有些汉堡必须有还有一些汉堡做好为前提) 给你的 ...