前提概要

内存泄漏是常见又重要的问题,针对这个问题谷歌在Android Studio 3.0中推出了Android Profiler。笔者此篇文章主要记录一下Android Profiler在内存泄漏方面的使用。

Android Profiler

Android Profiler在Android Studio左下角,需要在Android Studio 3.0及其以上才会有。如果是Android Studio 3.0并且也未有这个按钮,读者也不用着急,运行一下自己的项目就会出现。当点击MEMORY那一行的时候就能进入内存检查的界面。

接下来笔者通过分析内存泄漏的实例的方式来介绍Android Profiler的使用。

实例

主要是三个Activity:MainActivity,ActivityOne,ActivityTwo。 
MainActivity:主Activity,用于开启内存泄漏的两个Activity。 
ActivityOne:通过handler方式泄漏。 
ActivityTwo:通过静态引用方式泄漏。

代码如下: 
MainActivity:

public class MainActivity extends AppCompatActivity {public static Activity activity;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}private void initView() {Button btnOne=findViewById(R.id.btn_one);btnOne.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(MainActivity.this,ActivityOne.class);startActivity(intent);}});Button btnTwo=findViewById(R.id.btn_two);btnTwo.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent=new Intent(MainActivity.this,ActivityTwo.class);startActivity(intent);}});}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

ActivityOne:

public class ActivityOne extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);new Handler().postDelayed(new Runnable() {@Overridepublic void run() {}},1000000);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

ActivityTwo:

public class ActivityTwo extends Activity {@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);MainActivity.activity=this;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

内存泄漏分析

操作

首先我们打开MainActivity,分别开启ActivityOne和ActivityTwo并退出,回到MainActivity。接着打开Android Profiler。

检查内存泄漏对象

首先要点击左上方的“Dump Java heap”按钮。(如果是检查内存泄漏,笔者建议在点击之前先点击垃圾回收按钮,以防可回收的存货对象的混淆) 

然后就会显示此刻的JAVA堆中对象以及引用情况,我们可以在Heap Dump的右上角选择对象的排列方式,笔者比较推荐按报名排序,因为一般我们检查的都是自己所写的类的泄漏,而非系统层的。 

如图,我们很快就发现ActivityOne和ActivityTwo泄漏了。 
笔者打开了ActivityOne和ActivityTwo之后,回到MainActivity界面并按下垃圾回收按钮。不泄露的情况应该是只有MainActivity被分配了内存,而ActivityOne和ActivityTwo均存活,说明内存没有被释放,即内存泄漏了。

Heap Dump 右边四列的意思分别如下: 
Alloc Count:Java堆中的实例个数 
Native Size:native层分配的内存大小。 
Shallow Size:Java堆中分配实际大小 
Retained Size:这个类的所有实例保留的内存总大小(并非实际大小)

在内存泄漏检查的过程中,笔者也出现过理论上对象应该被回收,却仍保留的情况。一般情况下,如果Shallow Size和Retained Size都非常小并且相等,都可以认为是已经被回收的对象。因为系统已经不认为它会被用到,并且没有给它保留分配的内存。

解决内存泄漏(方法一)

继续我们在Heap Dump界面的操作,以检查ActivityOne为例,我们单击它,发现右侧出现了Instance View,然后单击Instance View的对象。 

在Instance View中,会显示在ActivityOne中的各种对象,而它下方的Reference则是显示诸多对这个存货的ActivityOne对象的引用。大部分都是系统层面的引用,只有一个格外显眼,就是通过“this”对ActivityOne的引用,点进去我们可以发现是MessageQueue持有了这个引用,有点经验的Android程序员马上可以定位到是Handler的内存泄漏了。

解决内存泄漏(方法二)

第一种内存泄漏的检查方法由于有过多的系统引用的混淆,相信并不让人觉得容易上手。这时候相信读者会想尝试第三个录制按钮了。 
Record memory allocations: 
这个按钮的作用是记录一段时间内的内存分配的内容,点击红色的小圆表示开始录制,点击小正方形是结束录制。(录制时间不建议超过10s,计算内存会很慢) 

操作

首先重新运行APP,停留在MainActivity界面,然后点击红色小圆按钮开始录制,接着分别打开ActivityOne和ActivityTwo然后退出,回到MainActivity界面,最后点击小正方形结束录制。

解决内存泄漏

然后我们仍然是按照包名排列,找到内存泄漏的对象。 

然后我们选择ActivityOne,再单击Instance View 中的这个对象。我们可以发现,完全能再代码中追踪到这个引用创建的地方。 

我们双击Call Stack中的第一行,发现可以直接跳转到代码内存泄漏的地方。 

两者优劣

解决内存泄漏方法一: 
1、可以用于检查内存泄漏,并不仅仅是查看引用情况。 
2、不需要定位引用的创建时间,因为查看的是java堆该时的状态。 
3、不可以定位到相关代码。 
4、系统引用也会显示,容易混淆。

解决内存泄漏方法二: 
1、可以直接定位到相关代码。 
2、不会有过多的系统引用混淆。 
3、需要定位对象创建的时间,在内存记录的时间内进行操作才会显示。

总结

Android Profiler只是解决内存泄漏的一个工具,在一些情况下无法定位到相关代码。比如以下情况:

A a=A();
……
c=a;
  • 1
  • 2
  • 3

在这种情况下,如果A类泄漏,那么代码只能定位到 “A a=A();”,而下面的间接引用却无法由Android Profiler体现出来,这就需要读者通过阅读源码来自行解决了。

总之也算是孰能生巧,新工具固然能提高我们的效率,但是还是无法替代手动检查的工作。

转自:https://blog.csdn.net/Double2hao/article/details/78784758

感谢楼主无私分享!

(Android Studio 3.0)Android Profiler内存泄漏检查相关推荐

  1. Android Studio 3.0+ 版本的自定义lint检查

    Android Studio 3.0+ 版本的自定义lint检查 定义LintModule 开发lint规则 lint库依赖 新建log检查规则 LogDetactor IssueRegistry 注 ...

  2. 利用Android Studio的 Monitor Memory 查找内存泄漏

    App开发总会遇到内存泄漏的情况,在Eclipse时代我们一般使用MAT来配合分析,Android Studio会方便一些,因为它自带了一个Monitor Memory.下面我们来看看怎么使用这个工具 ...

  3. Android Studio 3.0 正式版本 发行说明 (翻译)

    前言 as终于发正式版了.赶快来看看有什么新的功能.本文采用翻译器翻译. Android Studio是为Android开发的官方IDE,包含构建Android应用程序所需的一切. 1.要获取最新版本 ...

  4. Android Studio 性能优化工具 - Profiler、CPU Profiler、Memory Profiler、Netwrok Profiler、Evengy Profiler 详解

    关于性能优化的问题,可能一直有遇到,也一直在解决,但是在中小厂和自我要求不严格的场景下,我们很少去实实在在的做性能优化: 在性能优化中我们通常会通过自己的经验或工具来发现问题,本想着能短时间内搞定Pr ...

  5. Android性能优化(2):常见内存泄漏与优化(二)

    文章目录 1. Android虚拟机:Dalvik和ART 1.1 JVM与Dalvik区别 1.2 Dalvik与ART区别 1.3 Dalvik/ART的启动流程 2. 常见内存分析工具 2.1 ...

  6. android studio 3.0新功能介绍

    谷歌2017发布会更新了挺多内容的,而且也发布了AndroidStudio3.0预览版,一些功能先睹为快.(英语一般,有些翻译不太好) 下载地址 https://developer.android.g ...

  7. 神经网络API、Kotlin支持,那些你必须了解的Android 8.1预览版和Android Studio 3.0新特性

    曾仅用 55 秒发布会的 Android 8.0 Oreo 在时隔两个月后,Google 于今天在其官方网站上正式发布了 Android 8.1 首个开发者预览版,此次升级涵盖了针对多个功能的提升优化 ...

  8. visual studio 最新稳定版本_速来围观!Android Studio 4.0 稳定版发布了

    作者:恋猫de小郭 Android Studio 4.0(2020年5月) 更新啦!此版本包含了各种新功能和改进,还有一些废弃配置. 重要提示:更新后,需要重新启动 Android Studio 才能 ...

  9. Android Studio 3.0+ 新Dex编译器D8 Desugar R8

    原文链接 https://blog.csdn.net/jamin0107/article/details/81123154 〇.序 将.class自己码转化为.dex字节码作为Apk打包的关键步骤,G ...

最新文章

  1. Mxnet TensorRT
  2. Oracle10g的flashback drop
  3. 学编程的日子里,很多人因迷茫放弃了编程,那我们应该怎么做呢?
  4. day14——内置函数
  5. 计算机文字排版竞赛标准,文字录入与排版高手竞赛方案(Word2010).doc
  6. 产品设计思维工具(2019年做产品的一点总结)
  7. The /usr/local/mysql/data directory is not owned by the 'mysql' to '_mysql' user
  8. Android零基础入门第6节:配置优化SDK Manager,正式约会女神
  9. diskgenius扩容c盘重启电脑卡住_无损扩容分区
  10. 3D图形渲染及数字图像处理算法相关文集
  11. 高中数学立体几何证明套路高考试题(附答案)
  12. android_iphone和java三个平台一致的加密方法_Android、iPhone和Java三个平台一致的加密工具...
  13. 淘宝客订单同步,关联私域授权用户,给用户返分,流程是如何串起来的
  14. Python爬虫实战——反爬机制的解决策略【阿里】
  15. HTML+js图片验证码编写
  16. html中图片不溢出,防止图片过大超出DIV的CSS样式
  17. 生产力工具-笔记、任务管理工具软件,让你的时间更加有用!
  18. 推荐一些基于vue.js的uni-app框架前后端分离的一些毕设项目
  19. [商业][思想]《免费 -- 商业的未来 Free The Future of a Radical Price》 -- 克里斯·安德森(美)...
  20. Introduce·传播学重点核心期刊推荐之《中国编辑》

热门文章

  1. SVG映射反爬示例练习——直接提取SVG文字图片的文本
  2. 手机APP中的强者,超乎你想像!
  3. OPPOReno4SE和realmex7pro哪个好
  4. 有四个数字1,2,3,4,能组成多少个互不相同的三位数
  5. 灌篮高手中“樱木花道”的生活原型
  6. Android讯飞语音集成【语音评测3】
  7. (附源码)计算机毕业设计SSM作业批改管理系统
  8. 谁要是娶这种妻子就不配做男人!(转载)
  9. 如何抓取微博https Java,java如何爬取微博信息,或者通过接口获取微博信息
  10. 华为云服务器可用区是什么意思?