首页 存档 技术 查看内容

【宝贵经验】Android性能优化之内存优化实战

2018-3-30 13:00 |来自: 互联网 278 0

摘要: 1. Memory Leak 内存泄漏:对于Java来说,就是new出来的Object 放在Heap上无法被GC回收(内存中存在无法被回收的对象);内存泄漏发生时的主要表现为内存抖动,可用内存慢慢变少。 1.1 Memory Monitor AndroidStudio ...

1. Memory Leak

内存泄漏:对于Java来说,就是new出来的Object 放在Heap上无法被GC回收(内存中存在无法被回收的对象);内存泄漏发生时的主要表现为内存抖动,可用内存慢慢变少。

1.1 Memory Monitor

AndroidStudio自带的Memory Monitor可以方便的观察堆内存的分配情况,并且可以粗略的观察有没有Memory Leak。


频繁的内存抖动,可能存在内存泄漏

  • A:initiate GC 手动触发GC操作;

  • B:Dump Java Heap 获取当前的堆栈信息,生成一个.hprof文件,AndroidStudip会自动使用HeapViewer打开;一般用于操作之后检测内存泄漏的情况;

  • C:Start Allocation Tracking 内存分配追踪工具,用于追踪一段时间的内存分配使用情况,能够知道执行一些列操作后,有哪些对象被分配空间。一般用于追踪某项操作之后的内存分配,调整相关的方法调用来优化app性能与内存使用;

  • D:剩余可用内存;

  • E:已经使用的内存。

点击Memory Monitor的Dump Java Heap,会生成一个.hprof文件,AndroidStudio会自动使用HeapViewer打开。


Hprof Viewer打开.hprof文件

左面板说明:

  • Total Count 该类的实例个数

  • Heap Count 选定的Heap中实例的个数

  • Sizeof 每个实例占用的内存大小

  • Shallow Size 所有该类的实例占用的内存大小

  • Retained Size 该类的所有实例可支配的内存大小

右面板说明:

  • Instance 该类的所有实例对象(左侧Total Count为15,此处就有15个对象)

  • Depth 深度, GC Root点到该实例的最短链路数

  • Dominating Size 该实例可支配的内存大小

此处可以看出MainActivity存在了15个示例对象,怀疑此处有问题。

1.2 MAT

上述只是可以粗略的看出是不是有问题,而要知道问题出在哪里就需要借助MAT了。将生成的.hprof文件进行转换,然后使用MAT打开;

格式转换命令:hprof-conv 原文件路径 转换后文件路径


MAT打开.hprof

注意下面的Actions:

  • Histogram可以列出内存中每个对象的名字、数量以及大小。

  • Dominator Tree会将所有内存中的对象按大小进行排序,并且我们可以分析对象之间的引用结构。
    一般使用最多的也是这两个功能。

Retained Heap表示这个对象以及它所持有的其它引用(包括直接和间接)所占的总内存

  • 使用Histogram:

  • 点击Histogram并在顶部的Regex中输入MainActivity会进行正则匹配,会将包含“MainActivity”的所有对象全部列出了出来,其中第一行就是MainActivity的实例。


  • 对着想查看的对象点击右键 -

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部