内存分析(in-memory analytics)是我们编写速度快、效率高的代码必不可少的知识。如果自己编写的代码在内存的分配一无所知,我想这样的程序让你去优化,应该是无从下手的。那么内存分析是什么?是指当数据存放在计算机的随机存取存储器(RAM)中时查询数据的方式,和存储在物理磁盘中的数据的查询方式相反。随着RAM成本的下降,内存分析对很多业务都变得可行。

  Android的一些内存知识

  垃圾回收(GC)

  垃圾回收包含两个过程:

   1)判定阶段,也就是判断哪些对象可以被回收,

   2)收集阶段,是指具体的回收策略。

  判定阶段主要有两种方式

   1)引用计数,对象每多一个引用计数加1,少一个引用计数减1,计数为0时就表示这个对象可以被回收了。但是引用计数有个缺点,不能判断循环应用的情况,所以就有了下面的方式

   2)根搜索,从一些根对象(GCRoot)开始遍历搜索,如果一个对象无法被搜索到,说明这个对象可以被回收了。

  可以作为GCRoot的对象:

  1 一些虚拟机栈中的对象;2 方法区中的类静态属性对象;3 方法区中的常量对象;4 Native栈中JNI的引用对象

  收集阶段主要有四种方式

  1)标记清除,最简单的算法,讲标记好的对象直接清除,速度快,但效率不高,内存碎片

  2)复制算法,每次使用可用内存的一半,收集时将可用对象复制到另一半内存,回收这一半

  3)标记整理,将存活对象整理到内存区域的一端,剩余部分回收

  4)分代回收,将内存区域按对象存活周期划分为青年代和老年代等,不同区域采用上面不同的收集算法。

  Dalvik与ART

  Android5.0 之前使用Dalvik虚拟机,之后使用ART虚拟机,下面是一些比较:

  Dalvik在运行时将字节码转换为机器码,ART在安装的时候就转换为机器码,这样安装好的应用会占用更大的空间,但是运行时少了转换的时间,所以运行更快

  ART提供了更好的垃圾回收表现,将垃圾回收时,程序的暂停次数由两次(分析、清理)减少到一次;程序暂停时,并行的进行垃圾回收处理;回收新近分配的、生命期短的对象,垃圾回收器花费的时间更少

  Android内存分析工具

  Memory Monitor

  GC操作需要暂停其他线程,因此短时间频繁的GC会对UI线程产生影响,导致频繁GC一般有两种情况,

  大量的对象被创建又在短时间内马上被释放,比如在View的onDraw方法中创建对象

  Young Generation的内存区域达到阀值,剩余空间不够的时候,也会触发频繁GC

  Android Studio提供了Memory Monitor来实时显示应用运行时内存占用情况,下边蓝色部分是现在占用的内存,上面灰色的部分显示是已回收的内存。如果在图上看到尖峰,也就是快速分配内存又被回收,也就是发生了内存抖动,这里就是需要优化的地方。

  Allocation Tracking

  Allocation Tracking是DDMS中提供内存工具,用来显示一段时间内的内存分配情况。

  选择要跟踪的进程名,点击Start Tracking开始跟踪,做一些操作后点击Get Allocations就可以将这段操作中新分配的对象显示出来,点击具体的对象可以在下面看到是哪一个方法分配的这个对象。

  Heap Tool 与 MAT

  Heap Tool可以查看当前的内存快照

  从数据里可以看到当前内存的占用和回收情况,每次垃圾回收这里的数据都会更新,因为会不断获取内存数据刷新显示,所以这时候对应用操作会出现卡顿。

  Heap Tool提供的是一个内存的总体情况,图表显示的内容比较简单,如果要具体分析的话最好生成.hprof文件,使用MAT工具进行分析。

  关于MAT工具的使用已经有很多介绍,google官方曾经写过一个使用介绍,有兴趣可以上网查阅。

  一般用到MAT工具分析内存都是因为发生了应用发生了内存泄漏,需要自己去分析可能泄漏的地方,然后用MAT工具去验证。而最近Square公司开源了一个内存泄漏检测项目LeakCanary,极大地简化了这个过程,可以说是Android内存泄漏检测的终极利器。

  LeakCanary

  A memory leak detection library for Android and java.

  LeakCanary会检测应用的内存回收情况,如果发现有垃圾对象没有被回收,就会去分析当前的内存快照,也就是上边MAT用到的.hprof文件,找到对象的引用链,并显示在页面上。

  使用:

  在build.gradle文件中添加

  在应用的application onCreate方法中添加LeakCanary.install(this),如下

  应用运行起来后,LeakCanary会自动去分析当前的内存状态,如果检测到泄漏会发送到通知栏,点击通知栏就可以跳转到具体的泄漏分析页面。

  Tips

就目前使用的结果来看,绝大部分泄漏是由于使用单例模式hold住了Activity的引用,比如传入了context或者将Activity作为listener设置了进去,所以在使用单例模式的时候要特别注意,还有在Activity生命周期结束的时候将一些自定义监听器的Activity引用置空。

  关于LeakCanary的更多分析可以看项目主页的介绍,还有这里http://www.liaohuqiu.net/cn/posts/leak-canary-read-me/

  Reference

上文简单介绍了Android的一些内存知识,主要是垃圾回收(GC)的过程、阶段性方式和GCRoot的对象,还简单说明一下Dalvik与ART这两个虚拟机,最后详细介绍了android内存分析工具,有Memory Monitor、 Allocation Tracking、Heap Tool 、 MAT和LeakCanary这几个分析工具,还有一些使用方法和一些小提示,如果有兴趣,可以参考下面给出的参考资料。

转载地址:http://www.kokojia.com/article/19208.html

android--------Android内存分析工具的使用的更多相关文章

  1. Android优化—— 内存分析工具 MAT 的使用

    1 内存泄漏的排查方法 Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,其中有两项功能可用于内存检查 : ·    heap 查看堆的分配情况 ·     ...

  2. [Android Memory] 内存分析工具 MAT 的使用

    转载自: http://blog.csdn.net/aaa2832/article/details/19419679 1 内存泄漏的排查方法 Dalvik Debug Monitor Server ( ...

  3. Android 内存分析工具 MAT(Memory Analyzer Tool)

    如果使用DDMS确实发现了我们的程序中存在内存泄漏,那又如何定位到具体出现问题的代码片段,最终找到问题所在呢?如果从头到尾的分析代码逻辑,那肯定 会把人逼疯,特别是在维护别人写的代码的时候.这里介绍一 ...

  4. Android内存分析工具DDMS heap + MAT 安装和使用

    一  Java内存分析工具扫盲 如果像我一样一点都不了解,可以先进行内存分析工具扫盲   MAT介绍:     Eclipse Memory Analyzer(MAT)一个功能丰富的 JAVA 堆转储 ...

  5. Android内存优化(三)详解内存分析工具MAT

    前言 在这个系列的前四篇文章中,我分别介绍了DVM.ART.内存泄漏和内存检测工具的相关知识点,这一篇我们通过一个小例子,来学习如何使用内存分析工具MAT. 1.概述 在进行内存分析时,我们可以使用M ...

  6. Android内存分析工具

    在Android系统开发过程中,经常会要去分析进程的内存的使用情况,简单介绍下Android内存分析的相关工具. 文章参考: 1.dumpsys 2.memory-analysis-command 1 ...

  7. android--------Eclipse中ddms heap内存分析工具

    无 论怎么小心,想完全避免bad code是不可能的,此时就需要一些工具来帮助我们检查代码中是否存在会造成内存泄漏的地方. Android tools中的DDMS就带有一个很不错的内存监测工具Heap ...

  8. [原创]推荐一款强大的.NET程序内存分析工具.NET Memory Profiler

    [原创]推荐一款强大的.NET程序内存分析工具.NET Memory Profiler 1 官方网站:http://memprofiler.com/2 下载地址:http://memprofiler. ...

  9. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...

随机推荐

  1. 【Redis学习之九】Redis集群:Twemproxy和HA

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 redis-3.0.4 主从模式对写压力没有分担,解决思路就 ...

  2. react脚手架构建工程

    https://blog.csdn.net/qtfying/article/details/78665664 第二步:安装less包: https://segmentfault.com/a/11900 ...

  3. javaScript的内置对象以及一些常用的方法

    前几天,我们学习了JavaScript的入门课程,但是要想做网站,仅仅学会入门是不够的,今后的几天,我将带领大家精通JavaScript,希望大家好好学习! JS内置对象 String对象:字符串对象 ...

  4. [转载]DropDownList三级菜单联动源码

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  5. 20145127《java程序设计》第九周学习总结

    一.教材学习内容总结 第十六章 整合数据库 16.1 JDBC入门 JDBC(Java DataBase Connectivity) 驱动的四种类型 JDBC-ODBC Bridge Driver N ...

  6. 【第二十四章】 springboot注入servlet

    问:有了springMVC,为什么还要用servlet?有了servlet3的注解,为什么还要使用ServletRegistrationBean注入的方式? 使用场景:在有些场景下,比如我们要使用hy ...

  7. C#学习笔记(九):函数、代码查询和调试

    代码查询和调试 代码查询 using System; using System.Collections.Generic; using System.Linq; using System.Text; u ...

  8. UVa 11991 一道简单题

    https://vjudge.net/problem/UVA-11991 题意:给出一个包含n个整数的数组,你需要回答若干询问.每次询问两个整数k和v,输出从左到右第k个v的下标. 思路: 把每个数字 ...

  9. H5本地存储一

    localStorage(本地存储),可以长期存储数据,没有时间限制,一天,一年,两年甚至更长,数据都可以使用.sessionStorage(会话存储),只有在浏览器被关闭之前使用,创建另一个页面时同 ...

  10. Java中的this

    首先this作为关键字其实是随着对象的创建而产生的,当我们调用对象的一个方法的时候: 例如: A a = new A(); a.f(1)  其实我们可以理解为a.f(a,1) 编译器默默的把所操作的对 ...