观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  这篇博客鸽了很久, 时间是一方面,另一方本人其实很菜.测试转开发对底层,半路出家对底层的认知非常少. 所以,这篇博客之前的内容已经全部删除了. 现在更新全新内容.主要是两个方面

  • 捕获与分析内存泄露
  • 发生内存泄露的例子

捕获内存泄露

  这里并不打算使用内存泄露检测框架LeakCanary(这是捕获内存泄露的好工具,适合在黑盒测试时一起使用,缺点是没办法实时观察内存泄露与内存情况,并且有时候这东西在性能较差的设备上容易引起ANR)

  而是使用Android Studio 自带的 Android Profiler 来抓取发生内存泄露的情况,所以这里先讲解下如何使用Android Profiler 抓去内存泄露.

启用Profiler

有两种方式:

方式一 点击工具栏图标

方式二 从下方图标进入

步骤一

步骤二 

了解基本Profiler信息

点击内存信息查看

捕获内存片段

在上面的图片中选择捕获内存片段后,会跳出下面这个页面

 

快速定位代码

在捕获到内存片段后,可以看到有大量的各种class的内存信息. 其中大部分底层class并不需要关心. 而是想看项目中的class. 这里我们可以通过选择过滤方式来快速定位到我们的项目目录与代码.

发现内存泄露

在上面知道自己项目路径与class后, 我们需要知道这些class有没有内存泄露. 现在通过一个单例去持有一个TestDemoActivity创造一个内存泄露. 就可以通过下面的方式获悉TestDemoActivity存在了内存泄分析内存泄露

分析内存泄露

发现内存泄露并不难,分析找到内存泄露的地方才是最困难的. 一般的被单例持有的泄露很好找到. 而有一些是泄露代码特别难以发现. 

这里先用单例持有Activity的泄露来分析

第一步

 第二步, 跳转到目标class,剩下的事情就是自行排查代码了.如果这个class代码量很多,你无法找到泄露地方. 你可以使用排除代码的思维查找, 将这个class的代码一部分一部分的注释掉在编译运行app触发泄露,最终找到泄露代码

现在看看因为ObjectAnimator动画在activity退出的时候未调用cancel导致的内存泄露,并且分析它(可以找到泄露class,但是难以查找到具体原因),所以找这种内存泄露只能有最笨的排除法了

 

 

 

 

 

 

 

end

posted on 2019-04-13 18:43  观心静  阅读(7813)  评论(3编辑  收藏  举报