内存泄露测试的整个过程如下:

  • 在手机里启动被测APP并打开DDMS。

  • 在DDMS中选中【com.example.android.hcgallery】之后单击按钮【show heap updates】,然后切换到标签页【VM Heap】,再单击按钮【Cause GC】。

  • 不断操作APP,并观察Heap。经过一段时间的操作我们发现不论是%Used还是data object的Total Size都在不断增加,如图。正常情况下Total Size会稳定在一定范围内。

图 VM Heap 1

  • 即使进行Cause GC之后仍会继续增加,如图

图 VM Heap 2

  • 此时我们怀疑如果长期下去可能有内存泄露的可能性,为了进一步分析我们单击按钮【Dump HPROF File】,得到一个后缀为hprof的文件(生成该文件的时间较长,请耐心等待)。

  • 使用命令hprof-conv将得到的hprof文件转化为标准的hprof,这样MAT才能识别。

  • 使用MAT打开转化之后的hprof文件,选择图中的【Leak Suspects Report】即可。之后你会看到一个概要信息,如图。它只是给出一个宏观的概念,告诉你某些问题的占比,对于分析并没有实质性的帮助。

  • 单击柱形图标按钮【Histogram】会生成一个视图,它显示的是类实例的列表,其中Shallow Heap代表对象自身占用的内存大小,不包括它引用的对象。Retained Heap代表当前对象大小和当前对象可直接或间接引用到的对象的大小总和。

  • 在Shallow Heap列进行从大到小的排序,我们发现byte[]占比最大,选中之后右键依次选择【List objects】>【with incoming referenes】进行钻取,如图。

图 Histogram视图

  • 再次按照Shallow Heap列进行从大到小的排序,选择一个较大的对象并依次展开它的路径,如图。这里我们关注自己写的代码,也就是com.example.android.hcgallery.ContentFragment,我们发现mBitmap比较可疑。这种方法适合对代码比较熟悉的朋友。

图 with incoming references

  • 除了上述方法之外你也可以通过排除弱引用来分析,这样能减少干扰因素。先按照Retained Heap从大到小排序,之后右键最大的,依次选择【Path To GC Roots】>【exclude weak references】,得到如图的数据。发现sBitmapCache这个变量占的比例较大,可能有问题。

图 exclude weak references

小强课堂 在Java中存在强引用、弱引用、软引用,这里给大家做一个普及:

强引用:垃圾回收不会回收它,需要我们主动设置为null。

弱引用:顾名思义比较弱,当垃圾回收发现它只具有弱引用对象时,不管当前内存空间是什么情况,都会进行回收。

软引用:如果它只具有软引用对象时,内存空间足够,垃圾回收器就不会回收。但如果内存空间不足了,就会回收。

  • 之后排查代码发现sBitmapCache是static HashMap,mBitmap使用完成之后没有recycle掉。

  • 最后修改代码,在mBitmap != null时进行mBitmap.recycle()。

这样一步步做下来至少你不会觉得混乱,而是有规可循。另外,有些内存泄露的分析可能没法一次性分析出来,需要多次,这就考验大家的耐心了。其实只要记住,分析要有规可循,耐心必不可少,任何难题都可以解决的。

转载于:https://blog.51cto.com/xqtesting/2402372

案例:隐秘而低调的内存泄露(OOM)相关推荐

  1. 彻底搞懂Java内存泄露

    Java内存回收方式 Java判断对象是否可以回收使用的而是可达性分析算法. 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的.这个算法的基本思路就是通过一系列名为& ...

  2. python 单例模式内存泄露_彻底搞懂Java内存泄露

    之前一直在简书写作,第一次发布到SF上来,也是第一次使用SF,后面会尽量同步到SF,更多文章请关注: 简书 编程之乐 转载请注明出处:谢谢! Java内存回收方式 Java判断对象是否可以回收使用的而 ...

  3. java线程内存溢出_Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    Java垃圾回收机制(GC) 1.1 GC机制作用 1.2 堆内存3代分布(年轻代.老年代.持久代) 1.3 GC分类 1.4 GC过程 Java应用内存问题分析 2.1 Java内存划分 2.2 J ...

  4. 全方位带你彻底搞懂Android内存泄露

    1 Java内存回收方式 Java判断对象是否可以回收使用的而是可达性分析算法. 在主流的商用程序语言中(Java和C#),都是使用可达性分析算法判断对象是否存活的.这个算法的基本思路就是通过一系列名 ...

  5. 在MySQL 5.7下排查内存泄露和OOM问题全过程

    0.导读 我的个人网站后台使用的是MySQL 5.7版本,前段时间经常被oom-kill,借助5.7的新特性,经过一番排查,终于抓到这只鬼. 1.问题现象 我的网站前段时间经常时不时就抽风一下,提示数 ...

  6. Analyzer tool(MAT)分析JVM内存泄露案例

    1.监控目的 2.常用分析工具 3.分析案例-MAT MAT 介绍及分析: 启动MAT, 然后选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件.文件加载完后,可以看到如 ...

  7. android oom 检测工具,Android中UI检测、内存泄露、OOM、等优化处理

    对Android整个优化分析,非常棒,下面是自己的积累笔记.可直接看原文. 界面检测工具: Fps: GPU检测, 使用Lint进行资源及冗余UI布局等优化 (很强大,布局的冗余) Memory检测G ...

  8. android oom工具,Android OOM-Heap,MAT工具检测内存泄露

    概述 在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在 ...

  9. Android开发中常见的内存泄露案例以及解决方法总结

    Android开发中常见的内存泄露案例以及解决方法总结 参考文章: (1)Android开发中常见的内存泄露案例以及解决方法总结 (2)https://www.cnblogs.com/shen-hua ...

最新文章

  1. Eclipse如何更改包名后,批量修改文件的包名
  2. r语言删除csv中na行_r语言,csv数据,提取特定行
  3. 设计模式在Netty中的应用-责任链模式源码举例
  4. Nginx的location配置详解
  5. ANC双重降噪+三种沉浸立体音效 OPPO无线降噪耳机正式发布
  6. MySQL utf8mb4字符集配置,支持emoji表情存储
  7. C#通过COM组件调用IDL的pro程序
  8. LoRa点对点系统9 下载源代码与PC软件
  9. javaweb户籍管理系统
  10. FPGA简单实现数据过采样
  11. Office在线协作(一)- 在本地服务器上安装ONLYOFFICE Docs Community Edition For Windows Server - 超详细安装教程
  12. ZEMAX | 照明设计中实用的光学模拟方法
  13. Multisim基础 调出面包板
  14. 计算机键盘上的句号键在哪,电脑键盘句号是哪个键
  15. Python肺CT图像窗位窗宽调整
  16. MySQL 8.0 新特性之窗口函数
  17. Balsamiq Mockups 便携版
  18. 磁性微型机器人通过结肠翻筋斗以输送药物
  19. 2022-2028全球与中国电动帆船市场现状及未来发展趋势
  20. infoQ 百度技术沙龙第25期回顾:海量数据处理技术解析

热门文章

  1. 计算机考试前的心情作文,考试时的心情作文(七篇)
  2. java -jar 内存溢出_JAVA系统启动栈内存溢出-StackOverflowError
  3. java内容置剪贴板
  4. java math 函数_Java中Math类常用函数总结
  5. leetcode132. 分割回文串 II
  6. addr2line 和 tombstone问题分析
  7. 深度学习(03)-- CNN学习
  8. mysql hp ux_hp ux apa 切换
  9. mysql 不能添加外键 1215_MySQL错误1215:无法添加外键约束
  10. 如何用区块链保障数据安全和承载数据确权