android内存优化心得

我们在开发中有时候会存在前期为了实现功能并没有好好去优化代码,虽然功能实现了但是呢我们的应用却并不健康。所以后期我们就需要对我们的应用去优化下,让它更健壮。针对这次对app的部分优化写下自己的心得,请各位大佬指教下。
首选优选就针对内存这块进行优化,重中之重的地方。那从哪里入手呢?我建议我们在做优化的时候可以先从最简单的地方入手,和我们频繁打交道的也就是我们比较熟悉的。 在项目中和我们频繁打交道就是Activity和fragment,那么我们就从他们先入手。

  1. 分析Activity
    从app的入口开始,然后进入app后,我们可以截取一部分功能进行反复点击和使用,我们可以一边模拟功能一边使用指令adb shell dumpsys meminfo packagename -d 去查看应用的情况,在这个阶段我比较关注android内存优化心得_第1张图片
    这几个字段,如果发生泄漏了,这几个数字会一直上涨,这就说明在这个操作中我们有activity发生泄漏了。既然发生泄漏了,那怎么知道具体的泄漏位置呢?
    这时候As为我们提供的工具就派上用场了。比较常见的泄漏我们一般用profiler就能分析的出来,而且这个是可以时时查看内存动态的,也比较容易查看内存抖动(在一段时间内内存呈现锯齿状)。我们在发现内存一直往上增加的时候,且没有下降的趋势,我们这时候就可以使用profiler触发gc,堆转储,就能看到这样的结果
    android内存优化心得_第2张图片
    leaks这里警报了就说明了我们的应用出现了泄漏问题,切换成按照包名分组,找到我们的应用包名,
    android内存优化心得_第3张图片
    到这里就很明显看出来是谁泄露了,进一步查看
    android内存优化心得_第4张图片
    原因找到了,被一个activity持有了,我们再找的过程中,需要结合自己的代码,这样更容易找到问题的原因。
    android内存优化心得_第5张图片
    这只是一个简单的泄露分析。当然我们可以将profiler配合leakcancry一起使用,这样分析效率更高。看个人了。
    前面两个工具我们基本只能处理泄漏问题,但是内存优化可不单单只是解决泄漏问题。在我们初次运行app的时候,请看图
    android内存优化心得_第6张图片

    android内存优化心得_第7张图片
    这是同一个app进程不存在情况下打开的效果,在最高的点一个240多mb,另一个202mb。所以我们对内存的使用也很重要,我们尽可能的去复用内存以及可以将不重要的类在使用的时候在初始化,对一些集合在使用的时候及时清理,以便释放更多的内存。
    分析工具可以使用mat mat下载地址,(备注:win版如果出现jvm和mat版本不对应提示,解决方案 找到mat内的 MemoryAnalyzer.ini文件,在第一行加入-vm
    D:\Download\jdk-17.0.8_windows-x64_bin\jdk-17.0.8\bin\javaw.exe jdk自行去官网下载 将路径复制进去即可)
    mat既可以分析泄漏问题,也可用于内存优化问题。我只是说我常用到的。从profiler获取的hprof需要用sdk中提供的 hprof-conv工具转换一下。
    我着重看的是Histogram和dominator_tree,他们之间的区别是Histogram 基于 类 的角度,dominator_tree是基于 实例 的角度。Histogram 不会具体显示每一个泄漏的对象,而dominator_tree会。在这两个菜单中都有
    Shallow Heap:表示对象自身占用的内存。
    Retained Heap:对象自身占用的内存 + 对象引用的对象所占用的内存。
    我们只看我们自己包名下的进行分析,切换成
    android内存优化心得_第8张图片
    找到我们自己应用的包名,
    android内存优化心得_第9张图片
    我们在分析内存泄漏的时候一定要懂这几个功能的意思
    with outgoing references:当前类引用了哪些对象
    with incoming references:哪些对象引用了它
    我们一般分析泄露使用with incoming references谁引用了我, 在选择marge shortest paths to gc roots 或者 path to gc roots , 然后在选择exclude all phantom/weak/soft etc. reference 等根据自己需求选择不同的排除。
    android内存优化心得_第10张图片
    一目了然的就看到了泄漏的原因。
    对内存的优化我们可以用compare basket。将两个hprof文件进行比对
    android内存优化心得_第11张图片
    选中histogram右键有一个add to compare basket。两个同样的操作,添加完后
    android内存优化心得_第12张图片如图所示,在点击红感叹号
    android内存优化心得_第13张图片
    我们可以使用这个对比功能帮助我们优化内存和内存泄漏问题。通过对比retained heap和shallow heap我们可以定点达到优化效果。
    对于mat的别的使用可以去网上百度。在我的使用过程中基本靠这些就能处理大部分的问题。
    在这里总结下内存优化的好处
    减少oom,提高应用稳定性。减少卡顿,提升流畅度。我们减少了内存的开支,那么就能提高应用的存活率。同时我们的代码更健壮减少bug和逻辑隐患。
    以上就是在分析内存的过程中的心得,内存优化是一个比较考验耐心的东西,我们需要找准问题的切入点,一步一步来不要着急。

你可能感兴趣的:(android,memory,MAT,android)