性能优化——内存泄漏(2)工具分析篇

原创 2017年06月30日 14:52:28

内存泄漏系列文章:
性能优化——内存泄漏(1)入门篇
性能优化——内存泄漏(2)工具分析篇
性能优化——内存泄漏(3)代码分析篇

一、简述

在上一篇《性能优化——内存泄漏(1)入门篇》中,介绍了内存泄漏的基本概念,并举了一个Demo,结合简单的代码分析,猜测出Demo中存在内存泄漏,并用Android Studio自带的Memory Monitor证明了我们的猜测,但开发中,业务逻辑可能比较复杂,对象引用繁多,难道都要这样去做代码分析吗?肯定不行,程序员的精力有限,且“很懒”(追求效率),我们需要工具来帮助我们进行分析。下面就来看看都有什么神器吧。

二、工具分析

1、System Information

System Information是Android Studio自带的分析工具,可以通过它来判断APP整体是否存在内存泄漏。

一个不存在内存泄漏的APP,在其退出并执行过GC后,APP中所有的View和Activity都会被销毁,所以,我们可以根据退出后内存中View和Activity的数量来判断这个APP是否存在内存泄漏。操作如下:

以上一篇中的Demo为例:
运行APP–>打开一个Activity–>屏幕旋转–>点返回键(两次)直到到桌面–>执行GC–>System Information–>Memory Usage

通过上述操作,会生成一个txt文本,其中就记录着View和Activity的数量。如下图所示,它们的值都为0(主要看Activities),说明本APP不存在内存泄漏。相反的,只要值不为0,那么APP是存在内存泄漏的。

这种方式只能判断整个APP是否存在内存泄漏,但无法知道哪里有内存泄漏,也无法得知是哪些对象引用造成的内存泄漏。

2、Analyzer Tasks

Analyzer Tasks 是Android Studio自带的分析工具,可以帮助我们快速定位内存泄漏,而且使用上 very easy~

打开一个内存快照(.hprof文件),Android Studio的右侧会出现Analyzer Tasks。

打开Analyzer Tasks后,可以发现有2个选项和一个按钮,说明如下图所示,我们需要的就是第一个”Detect Leaked Activities”。

执行任务后,下方的Analysis Results中会得到泄漏的Activity,而且直接定位到了MemoryLeakActivity[0],要上篇中得到的结果一样。

3、MemoryAnalyzer(MAT)

这工具,真心觉得有点复杂,但功能比Android Studio自带的Analyzer Tasks要强大的多。

MemoryAnalyzer是基于eclipse开发的,是一个单独的软件,它也是对.hprof文件进行分析,但必须是标准的.hprof文件,可以从Android Studio中导出。

运行MAT,通过File–>Open Dump分别打开刚刚导出的test1.hprof和test2.hprof,选择Leak Suspects Report–>Finish。

分析的方式有两种,一种是单文件分析,一种是多文件分析,我们先进行单文件分析。

1)单文件分析

切换到test2.hprof,打开Histogram。

点击Histogram后,会出来一个Histogram标签,会列出APP中所有类的实例个数,感觉跟Android Studio的.hprof查看器差不多,MAT中的Objects相当于AS中查看器的Total Count。

通过包名筛选,找出了我们自己写的代码,Android Studio的话可以通过切换视图来定位。可以发现MemoryLeakActivity的实例有2个,说明它可能存在泄漏,再联系之前在获取快照之前执行过GC,而这个Activity还没有销毁,说明这个Activity应该是泄漏了。好,到这里单文件分析就结束了。

2)多文件分析

分别将test1.hprof和test2.hprof的histogram添加到Compare Basket,详细操作如下图所示。

在Compare Basket中会有刚刚添加的两个.hprof,点击红色感叹号进行对比。

出来的Compared Tables列表跟Histogram很像,不过Objects和Shallow Heap标签都是成双成对。

一样,我们只关心我们自己的代码,所以通过Regex进行筛选。通过数据分析,可以知道,在旋转屏幕前后,MemoryLeakActivity的实例由1增加到了2,又因为test2.hprof是在执行了GC后获取的,所以可以判定MemoryLeakActivity在旋转屏幕后,内存泄漏了。

3)引用跟踪

通过单文件分析或多文件分析,我们知道MemoryLeakActivity发生了内存泄漏(被别的实例引用导致无法被GC回收),所以回到test2.hporf的Histogram,筛选出MemoryLeakActivity,右击List objects–>with incoming references。

出来的结果有2大块,即对内存中的2个MemoryLeakActivity实例分别被引用的结果进行了分类,可以看到每个MemoryLeakActivity都被好多个对象引用了。

结合上篇中提到的java中几个特殊类,我们知道SoftReference、WeakReference和PhantomReference在GC一般不会造成内存泄漏,所以这些我们可以不管,也说是说,我们可以对它们进行排除。

对两个Activity分别排除软、弱、虚引用后,得到的结果分别如下:

简单分析下就知道了,第一个MemoryLeakActivity实例是泄漏的,引用它的对象就是CommonUtil。

三、总结

1、工具方面

个人还是比较推荐使用Android Studio集成的System Information和Analyzer Tasks,主要是使用上方便快捷,还很简单,如果你是高手,并且需要有更强大的功能来帮助你检查APP中的内存泄漏的话,建议使用MAT,在网上多找些比较详细的文章看看,本文对MAT的介绍只是冰山一角。

2、操作方面

工具仅仅只是帮助我们快速定位APP中的内存泄漏,并不能直接告诉我们哪里有内存泄漏,实际开发中,需要我们去猜测,去思考,要有清晰的思维,想方设法的构思内存泄漏的判定依据。这需要我们自己去摸索,积累一定的经验。最后,在获取内存快照(Dump Java Heap)之前,建议多点几次Initiate GC,等内存稳定成一条线时再获取内存快照。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CSDN_LQR/article/details/73997851

那些年,你遇见的Android-Studio遇到的各种坑!!!!

本文转自:http://blog.csdn.net/u012874222/article/details/50616698 开此文章,主要是为了记录在使用虐我千百遍,我还待他如初恋的...
  • chenzhi0712
  • chenzhi0712
  • 2016-09-21 16:45:17
  • 1048

Android APP性能调优工具 Systrace 的使用

1 Systrace 简介 Android 应用启动速度优化方式有很多方法,不过在优化之前,需要找到应用启动速度的瓶颈,找到关键点之后,再去优化,则可以达到事半功倍的效果。 Google 提供了...
  • xiaodanpeng
  • xiaodanpeng
  • 2016-07-07 17:22:50
  • 2019

Android 性能优化之使用MAT分析内存泄露问题

我们平常在开发Android应用程序的时候,稍有不慎就有可能产生OOM,虽然JAVA有垃圾回收机,但也不能杜绝内存泄露,内存溢出等问题,随着科技的进步,移动设备的内存也越来越大了,但由于Android...
  • xiaanming
  • xiaanming
  • 2015-01-09 08:50:47
  • 34092

windows下内存泄露分析工具

windows检查程序是否存在内存泄漏方法1: 1.准备工具:windbg 2.准备环境:需要设置windbg符号路径 内存泄露分析demo [cpp] view plain cop...
  • listener51
  • listener51
  • 2016-10-23 11:35:03
  • 2167

Android应用开发性能优化完全分析

1 背景其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是只给...
  • yanbober
  • yanbober
  • 2015-10-11 02:20:58
  • 74677

性能优化——内存泄漏(2)工具分析篇

一、简述在上一篇《性能优化——内存泄漏(1)入门篇》中,介绍了内存泄漏的基本概念,并举了一个Demo,结合简单的代码分析,猜测出Demo中存在内存泄漏,并用Android Studio自带的Memor...
  • CSDN_LQR
  • CSDN_LQR
  • 2017-06-30 14:52:28
  • 1027

性能优化之工具篇

1.概述 一个应用性能的好坏并不能依靠我们的主观意识去评判,必须要看数据说话,因此必须要了解和学会使用各种性能测试工具才知道问题出在哪以及具体的优化方向。 2.标准 • 布局复杂度: 布局复杂...
  • fumin466566941
  • fumin466566941
  • 2016-10-20 12:13:31
  • 187

性能优化三之内存泄漏分析工具使用以及如何分析

这篇文章主要 分为四部分来具体讲解: 1.HeapSnapShot使用 2.HeapViewer使用 3.MAT使用 4.实际开发中怎么去运用上面三个工具来寻找可能发生内存泄漏的代码。 第一部分:...
  • hpc19950723
  • hpc19950723
  • 2016-12-10 22:33:34
  • 2043

应用开发进阶必经之路之性能优化

性能优化在一款产品的迭代过程中非常重要;程序实现了功能、还原产品原型只能保证程序能用,但如果要让用户更愿意使用,产品得好用。试想一下如果你开发的产品启动慢、页面显示需要长时间转圈加载、页面切换卡顿、黑...
  • u012532559
  • u012532559
  • 2016-10-18 16:46:52
  • 918

Android Studio和MAT结合使用来分析内存问题

Android开发中时常会遇到内存泄漏的问题,而Android系统对单个App又有一定的内存限制,此值可以通过一下方式获取:ActivityManager am = (ActivityManager)...
  • zxm317122667
  • zxm317122667
  • 2016-08-09 22:39:44
  • 11225
收藏助手
不良信息举报
您举报文章:性能优化——内存泄漏(2)工具分析篇
举报原因:
原因补充:

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