探索 Android 内存优化方法( 五 )


探索 Android 内存优化方法

文章插图
7.2 预防内存抖动的方法
  • 尽量避免在循环体中创建对象
  • 尽量不要在自定义 View 的 onDraw 方法中创建对象 , 因为这个方法会被频繁调用
  • 对于能够复用的对象 , 可以考虑使用对象池把它们缓存起来
8. 什么是 Memory Profiler?8.1 Profiler8.1.1 Profiler 简介
Profiler 是 Android Studio 为我们提供的性能分析工具 , 它包含了 CPU、内存、网络以及电量的分析信息 , 而 Memory Profiler 则是 Profiler 中的其中一个版块 。
打开 Profiler 有下面三种方式 。
  1. View > Tool windows > Android Profiler
  2. 下方的 Profiler 标签
  3. 双击 shift 搜索 profiler
打开 Profiler 后 , 可以看到下面这样的面板 , 而在左边的 SESSIONS 面板的右上角 , 有一个加号 , 在这里可以选择我们想要进行分析的应用 。
探索 Android 内存优化方法

文章插图
8.1.2 Profiler 高级选项
打开了高级选项后 , 我们在 Memory Profiler 中就能看到用一个白色垃圾桶表示的 GC 动作 。
打开 Profiler 的方式:Run > Edit Configucation > Profiling > Enable advanced profiling
8.2 Memory Profiler 简介
Memory Profiler 是 Profiler 的其中一个功能 , 点击 Profiler 中蓝色的 Memory 面板 , 我们就进入了 Memory Profiler 界面 。
8.3 堆转储
在堆转储(Dump Java Heap)面板中有 Instance View(实例视图)面板 , Instance View 面板的下方有 References 和 Bitmap Preview 两个面板 , 通过 Bitmap Preview , 我们能查看该 Bitmap 对应的图片是哪一张 , 通过这种方式 , 很容易就能找到图片导致的内存问题 。
要注意的是 , Bitmap Preview 功能只有在 7.1 及以下版本的设备中才能使用 。
探索 Android 内存优化方法

文章插图
8.4 查看内存分配详情
在 7.1 及以下版本的设备中 , 可以通过 Record 按钮记录一段时间内的内存分配情况 。
而在 8.0 及以上版本的设别中 , 可以通过拖动时间线来查看一段时间内的内存分配情况 。
点击 Record 按钮后 , Profiler 会为我们记录一段时间内的内存分配情况 。在内存分配面板中 , 我们可以查看对象的分配的位置 , 比如下面的 Bitmap 就是在 onCreate 方法的 22 行创建的 。
探索 Android 内存优化方法

文章插图
9. 什么是 MAT?9.1 MAT 介绍
对于内存泄漏问题 , Memory Profiler 只能给我们提供一个简单的分析 , 不能够帮我们确认具体发生问题的地方 。
而 MAT 就可以帮我们做到这一点 , MAT 的全称是 Memory Analyzer Tool , 它是一款功能强大的 Java 堆内存分析工具 , 可以用于查找内存泄漏以及查看内存消耗情况 。
9.2 MAT 使用步骤
要想通过 MAT 分析内存泄漏 , 我们做下面几件事情 。
  1. 到 MAT 的官网下载 MAT 。
  2. 使用 Memory Profiler 的堆转储功能 , 导出 hprof(Heap Profile)文件 。
  3. 配置 platform-tools 环境变量
  4. 使用命令将 Memory Profiler 中导出来的 hprof 文件转换为 MAT 可以解析的 hprof 文件 , 命令如下 platform-tools hprof-conv ../原始文件.hprof ../输出文件.hprof
  5. 打开 MAT
  6. File > open Heap dump  , 选择我们转换后的文件
9.3 注意事项
  1. 如果在 mac 上打不开 MAT , 可以参考Eclipse Memory Analyzer在Mac启动报错
  2. 如果在 mac 上配置 platform-tools 不成功的话 , 可以直接定位到 Android SDK 下的 platform-tools 目录 , 直接使用 hprof-conv 工具 , 命令如下 hprof-conv -z ../原始文件.hprof ../输出文件.hprof
10. 怎么用 MAT 分析内存泄漏?
我在项目中定义了一个静态的回调列表 sCallbacks , 并且把 MemoryLeakActivity 添加到了这个列表中 , 然后反复进出这个 Activity , 我们可以看到这个 Activity 的实例有 8 个 , 这就属于内存泄漏现象 , 下面我们来看下怎么找出这个内存泄漏 。
首先 , 按 8.3 小节的步骤打开我们的堆转储文件 , 打开后 , 我们可以看到 MAT 为我们分析的一个预览页 。


推荐阅读