Android内存泄漏检测

一、      背景

内存泄漏(Memory Leak)是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。通常我们开发的app如果没有检测内存泄漏严重时会导致崩溃,所以还是有必要检测一下的。

二、      android mat工具使用

1、 mat(Memory Analyzer Tool)下载地址:

http://www.eclipse.org/mat/downloads.php

2、  安装

安装很简单,把下载的zip包解压到一个地方,进入该目录,点击MemoryAnalyzer.exe就能启动了,不过前提是你已经安装好了JAVA环境才行

3、  使用

1) 生成hprof文件,这个文件就是你dump的内存数据,这里介绍一下android studio如何生成hprof文件:

a)    打开android profile,找到下图红框处的图标,点击后就会开始dump内存

b)    Dump内存结束后会出现下图,选择红框处点击就会生成hprof文件,将这个文件保存在某个路径下

c)    将生成的hprof文件进行转换,转换后才能用于mat工具,找到保存的hprof文件,执行命令hprof-conv input.hprof out.hprof,其中hprof-conv是在sdk目录下的plateform-tools下面,最后将转换后的文件导入mat工具里分析

2) 分析内存泄漏

a)    点击下图红框处的Histogram,然后会出现所有的对象列表

b)    在类名搜索里面搜索Activity,特别注意搜索是区分大小写的,如果输入activity,是搜不到任何Activity的

c)    在选中的Activity右击选择list objects,其中

list objects -- with outgoing references : 查看这个对象持有的外部对象引用。

list objects -- with incoming references : 查看这个对象被哪些外部对象引用。

这里我们是查看Activity被哪些对象持有导致没有被释放,所以选择with incoming references

d)    在选中的Activity右击Path To GC Roots,目的是为了找出Activity没有被回收的罪魁祸首

e) 查找内存泄漏的最终原因

如上图,我们发现MainActivity被三个对象持有,其中后两个是系统对象,这里就不用管了,我们重点看第一个,可以看到第一个最终延伸到一个dialog对象,这边我们先看一下测试源码:

  1. public class MainActivity extends AppCompatActivity{
  2. private static Dialog dialog;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. dialog = new Dialog(this,R.style.AppTheme);
  8. dialog.show();
  9. dialog.dismiss();
  10. }
  11. }

可以看到我们做了一个简单的内存泄漏实验,一个静态的Dialog对象持有Activity对象,因为是静态的,所以退出app后还是存在的,因此Activity无法被释放,然后结合我们的内存分析可以看到我们找到了这个罪魁祸首。

shallow heap -- 对象本身大小

retained heap -- 对象被回收后会释放的大小

Android系统性能优化(67)----内存泄漏检测相关推荐

  1. Android 性能优化之内存泄漏检测以及内存优化(上)

    在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完成的,Java/Android 程序员不用像 C/C++ 程序员一样手动调用相关函数来 ...

  2. android内存泄漏原因分析,Android Studio3.6的内存泄漏检测功能 VS LeakCanary

    2020年2月,谷歌发布了Android Studio 3.6版.它包括一个新的"内存泄漏检测"功能.这是否意味着我们不再需要流行的内存泄漏检测库"Leak Canary ...

  3. android性能优化 掘金,Android性能优化之内存泄漏

    内存泄漏:内存单元使用完成后未释放,未回收. 理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题. 在目前的Android项目中,内存泄漏是无法避免的,在编写代码时要是否产生了内存泄漏.内存泄 ...

  4. Android 性能优化之内存泄漏,使用MATLeakCanary解决问题

    本文授权发布公众号[刘桂林],星球[Hi Android] App进行到最终的测试的时候,往往会出现一些性能上,以及内存上的问题,需要优化,这也是一个Android高级工程师所需要了解并且掌握的知识点 ...

  5. 老李分享:Android性能优化之内存泄漏 3

    线程造成的内存泄漏 对于线程造成的内存泄漏,也是平时比较常见的,如下这两个示例可能每个人都这样写过: //------test1 new AsyncTask<Void, Void, Void&g ...

  6. Android性能优化之内存优化浅析

    一.背景 Android由于是以Java语言为主要开发语言,所以它的内存管理并不像C语言那样由开发者去管理内存的分配以及回收等,而是交由JVM虚拟机的内存回收机制去处理.这就导致我们在开发过程中难免会 ...

  7. Android内存泄漏检测工具使用手册

    Android内存泄漏检测工具使用手册 前言 LeakCanary 在Android中接入LeakCanary LeakCanary内存泄漏分析 内存泄漏上报到服务端 Shark Shark分析当前应 ...

  8. 基于Android Studio的内存泄漏检测与解决全攻略

    自从Google在2013年发布了Android Studio后,Android Studio凭借着自己良好的内存优化,酷炫的UI主题,强大的自动补全提示以及Gradle的编译支持正逐步取代Eclip ...

  9. Android 系统性能优化(55)---Android 性能优化之内存优化

    Android 性能优化之内存优化 前言 Android App优化这个问题,我相信是Android开发者一个永恒的话题.本篇文章也不例外,也是来讲解一下Android内存优化.那么本篇文章有什么不同 ...

最新文章

  1. spring cloud中通过配置文件自定义Ribbon负载均衡策略
  2. 一个html有几个css,几个CSS的黑科技_html/css_WEB-ITnose
  3. 手机界面常见的的九宫格
  4. java 对象复制 反射_利用Java反射机制实现对象相同字段的复制操作
  5. 设计模式 之 建造者
  6. 嵌入式Linux驱动学习之路(十五)按键驱动-定时器防抖
  7. lisp如何将度分秒转换为弧度_重磅干货!如何利用Stata进行空间冷热点分析 | 社论前沿...
  8. 杭电1963 完全背包
  9. 苹果秋季发布会于9月16日召开;华为搜索业务将在国内亮相;Android 11正式版发布 | 极客头条
  10. solaris 10 bash配置
  11. Linux常用网络带宽监控工具(转)
  12. 如何调试Python extension
  13. 存储区域网络(SAN)概念和设计基础
  14. 虚拟机scala安装
  15. 计算机蓝屏代码0xc0000020,电脑运行程序时出现“损坏的映像错误0xc0000020”提示怎么办?...
  16. 计算机无法关机 总是自动启动,win10电脑关机后自动开机怎么办_win10电脑关机后自动开机的详细解决方法...
  17. 马克思主义基本原理笔记(黄色标记要求会背)
  18. 解析DELLR710服务器迁移操作内容
  19. 小白用户的福音——win10系统云重装
  20. 一篇小论文:VGGish-BiGRU网络

热门文章

  1. 第五章——微型计算机与外设的数据传输
  2. Nandflash 驱动深度分析(基于S3C2410)
  3. mysql中表的约束,主键外键唯一键
  4. 英语四级关于计算机阅读理解,英语四级阅读模拟训练附答案和精讲 第6篇:学习计算机...
  5. Latex学习记录2
  6. 用实例的方式去理解storm的并发度
  7. java设计模式6.代理模式
  8. jdbc mysql driver 6.0.2
  9. MeteoInfoLab脚本示例:多Y轴图
  10. 天空象棋——网站与用户