利用Android Studio、MAT对Android进行内存泄漏检测

Android开发中不免会遇到各类内存泄漏,若是不及时发现处理,会致使出现内存越用越大,可能会由于内存泄漏致使出现各类奇怪的crash,甚至可能出现因内存不足而致使APP崩溃。php

内存泄漏分析工具

Android的内存泄漏分析工具经常使用有Android Studio和基于eclipse的MAT(Memory Analyzer Tool)。经过二者配合,能够发挥出奇妙的效果。Android Studio可以快速定位内存泄漏的Activity,MAT能根据已知的Activity快速找出内存泄漏的根源。java

第一步:强制GC,生成Java Heap文件

咱们都知道Java有一个很是强大的垃圾回收机制,会帮我回收无引用的对象,这些无引用的对象不在咱们内存泄漏分析的范畴,Android Studio有一个Android Monitors帮助咱们进行强制GC,获取Java Heap文件。android

强制GC:点击Initate GC(1)按钮,建议点击后等待几秒后再次点击,尝试屡次,让GC更加充分。而后点击Dump Java Heap(2)按钮,而后等到一段时间,生成有点慢。git

生成的Java Heap文件会在新建窗口打开。github

第二步:分析内存泄漏的Activity

点击Analyzer Tasks的Perform Analysis(1)按钮,而后等待几秒十几秒不等,便可找出内存泄漏的Activity(2)。正则表达式

那么咱们就能够知道内存泄漏的Activity,由于这个例子比较简单,其实在(3)就已经能够看到问题所在,若是比较复杂的问题Android Studio并不够直观,不够MAT方便,若是Android Studio没法解决咱们的问题,就建议使用MAT来分析,因此下一步咱们就生成标准的hprof文件,经过MAT来找出泄漏的根源。android-studio

第三步:转换成标准的hprof文件

刚才生成的Heap文件不是标准的Java Heap,因此MAT没法打开,咱们须要转换成标准的Java Heap文件,这个工具Android Studio就有提供,叫作Captures,右击选中的hprof,Export to standard .hprof选择保存的位置,便可生成一个标准的hprof文件。eclipse

第四步:MAT打开hprof文件

MAT的下载地址,使用方式和eclipse同样,这里就很少说了,打开刚才生成的hprof文件。点击(1)按钮打开Histogram。(2)这里是支持正则表达式,咱们直接输入Activity名称,点击enter键便可。ide

搜索到了目标的Activity函数

右击搜索出来的类名,选择Merge Shortest Paths to GC Roots的exclude all phantom/weak/soft etc. references,来到这一步,就能够看到内存泄漏的缘由,咱们就须要根据内存泄漏的信息集合咱们的代码去分析缘由。

第六步:根据内存泄漏信息和代码分析缘由

使用Handler案例分析,给出的信息是Thread和android.os.Message,这个Thread和Message配合一般是在Handler使用,结合代码,因此我猜想是Handler致使内存泄漏问题,查看代码,直接就在函数中定义了一个final的Handler用来定时任务,在Activity的onDestroy后,这个Handler还在不断地工做,致使Activity没法正常回收。

// 致使内存泄漏的代码

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

textView = (TextView) findViewById(R.id.text);

final Handler handler = new Handler();

handler.post(new Runnable() {

@Override

public void run() {

textView.setText(String.valueOf(timer++));

handler.postDelayed(this, 1000);

}

});

}

修改代码,避免内存泄漏

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

textView = (TextView) findViewById(R.id.text);

handler.post(new Runnable() {

@Override

public void run() {

textView.setText(String.valueOf(timer++));

if (handler != null) {

handler.postDelayed(this, 1000);

}

}

});

}

private Handler handler = new Handler();

@Override

protected void onDestroy() {

super.onDestroy();

// 避免Handler致使内存泄漏

handler.removeCallbacksAndMessages(null);

handler = null;

}

从新测试,确保问题已经解决。

文章代码

https://github.com/taoweiji/DemoAndroidMemoryLeak

android内存泄漏MAT,利用Android Studio、MAT对Android进行内存泄漏检测相关推荐

  1. android studio visual studio 2015,Visual Studio Emulator for Android

    Visual Studio Emulator for Android 11/15/2016 4 分钟可看完 本文内容 Note This article applies to Visual Studi ...

  2. Android Studio +MAT 分析内存泄漏实战

    点击打开链接 对于内存泄漏,在Android中如果不注意的话,还是很容易出现的,尤其是在Activity中,比较容易出现,下面我就说下自己是如何查找内存泄露的. 首先什么是内存泄漏? 内存泄漏就是一些 ...

  3. Android Studio MAT内存分析初探

    点击打开链接 做开发有一些年头的想必都会碰到程序性能方面的问题,性能优化有很多种,但是首先我们得定位是哪一块的问题:好在前方有巨人可以让我们站,Android Studio已经为我们提供了性能分析工具 ...

  4. 【Android 内存优化】使用 Memory Analyzer ( MAT ) 工具分析内存 ( MAT 工具使用 | 最大对象 | 类实例个数 | 引用与被引用 | GC Roots 最短链 )

    文章目录 一. 内存中最大的对象 二. 查看每个类的对象实例的个数 三. 查看对象的引用与被引用 四. 查看对象到 GC Roots 的最短距离 1. 选择 Merge Shortest Paths ...

  5. Android性能优化之利用强大的LeakCanary检测内存泄漏及解决办法

    本篇文章主要介绍了Android性能优化之利用LeakCanary检测内存泄漏及解决办法,有兴趣的同学可以了解一下. 目录 前言 什么是内存泄漏? 内存泄漏造成什么影响? 什么是LeakCanary? ...

  6. Profiler分析内存抖动,Memory Analyzer(mat)分析内存泄漏(不懂砍我)

    前言: 最近在系统性的温习了一遍android性能优化.写博客是学习也是记录,希望在记录的同时也能帮助其他同学.最近我觉得我想出一个不懂系列."不懂揍我","不懂砍我&q ...

  7. android studio占内存大小,极大精简android studio在C盘的内存

    在C盘占很大的内存大约就2种原因: 1.SDK占内存太大 2.AVD模拟器占内存太大 第一种情况,移动SDK(用android studio不需要配置环境变量) 先移动C盘的Android目录,里面是 ...

  8. mat opencv 修改roi_OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat)...

    OpenCV Android:在新Mat中定义并保存ROI(OpenCV Android: Define and save ROI in new Mat) 我正在尝试将我的图像的一部分切割(裁剪)到另 ...

  9. android 不同项目代码合并在一块,android - 是否可以将两个(正在积极开发中的)Android应用程序模块合并到同一个Android Studio项目中? - 堆栈内存溢出...

    我有两个工作正常的Android应用程序模块A和B,与同一个Android Studio项目相同. 它们每个都可以单独构建和运行. 但是如果我通过指定将模块A添加为"模块依赖项" ...

  10. android studio 抽屉,java - Android导航抽屉(由Android Studio默认提供) - 堆栈内存溢出...

    当我按下导航菜单项的更改时,它的颜色为黄色,直到释放时一直按它为默认.我没有明确编写任何代码来设置这些设置. 我该如何停止?请帮忙. 这是我的代码. 主要布局 xmlns:android=" ...

最新文章

  1. 量子计算机人类意识云,意识上传-人类距离永生还要多久(大脑的工作原理很有可能与量子计算机一致)...
  2. entry for sde instance not found in services file解决方法[转]
  3. linux内核之旅ppt_一起玩转 Linux 内核之旅开源社区吧
  4. SQLServer奇偶数的输出
  5. java xml读取方法_Java读取XML文件的方法
  6. 【李宏毅2020 ML/DL】P60-61 Unsupervised Learning - Deep Generative Model
  7. 重新认识Java包的命名规则
  8. CompletableFuture 使用详解
  9. 高校水电费管理系统C语言课程设计
  10. 计算机系统分析师高级试题及答案,2013年计算机软考系统分析师试题及答案1
  11. 如何做一个炫酷的墨水屏电子钟?
  12. 怎么用python制作随机点名软件_利用Python实现课堂点名器!辅导员大大的夸赞了我!...
  13. 单变量微积分笔记1——导数1(导数的基本概念)
  14. cad模型轻量化_【技术帖】基于轻量化概念的碳纤维复合材料汽车保险杠设计
  15. X-Brain:如此美丽可爱的大脑工作原理
  16. 11.8号软基2.2.2
  17. es6之扩展运算符 Object.assign和 三个点(...)
  18. OmniPeek tools install and setting
  19. 计算机考试感受作文,关于考试感受作文5篇
  20. mysql数据库二级_全国计算机二级mysql数据库模拟试题及答案

热门文章

  1. 使用FileWriter向文本文件中写信息
  2. 标定_基于全景基础设施的多摄像机和3D激光雷达校准
  3. 论文笔记_S2D.58_2018-ICRA-基于直接法的使用LiDAR稀疏深度的视觉-激光雷达SLAM
  4. 自动驾驶_基于强化学习的自动驾驶系统
  5. 二叉搜索树的学习笔记(有解释)
  6. VS2013+cuda8.0配置及案例
  7. ESPNet: Efficient Spatial Pyramid of Dilated Convolutions for Semantic Segmentation(自动驾驶领域轻量级模型)
  8. C++调用SSD caffe模型进行物体检测-Opencv3.4.3
  9. 深度学习图像标注工具
  10. 使用git配合idea使用oschina代码仓库初级教程