当前位置: 首页 > article >正文

android 内存泄露实战分析

前两天测试测出一个内存泄露问题,困扰了我好几天,毫无头绪,今天突然灵光一现,找到了问题原因,解决了内存泄露问题,解决方法很简单,但是重要的是问题分析过程,所以有必要把解决问题思路记录下来,以便后续分析类似问题有参考作用,以下进入正题。

以上是性能测试同事测出的问题,红框的地方表示电话应用出现了三个泄露,遇到这种问题,咱们先拿到hprof文件,拿不到就找测试要或者自己跑对应的测试用例,测试方法也可以找测试要,拿到hprof文件后,使用android studio的profiler打开:

已上截图是我自己抓取的hprof文件,我的有七个泄露,这个不重要,重要的是他们都是同一个原因导致,打开后咱们接下来一步一步分析。我这个内存泄露都是同一个地方导致的,所以直接看activity就行了,如果你们的内存泄露是多个地方的话,那每个类都要看下,确定后在进入下一步,我为什么能确定都是同一个地方导致的呢?请看下面截图:

我只上传两张图片,表示activity都是被ObjectAnimator所持有,所以咱们只要关注一个对象就行了,不要被其他的干扰。你们在分析hprof文件的时候,也可以参我我这个,打开hprof文件,点击泄露对象个数leaks,然后选中其中一个,在点击References,把Show nearest GC root only选中,就能看到内存泄露的路径,操作方式如下图:

从上面的分析的出activity中某个View被ObjectAnimator所持有,但是从上面的信息来看,咱们并不知道具体是哪个view被持有,如果项目小的话一个一个的分析,也能解决,如果项目大且复杂的话那就如大海捞针了,我在这一块也困扰了好几天,网上也没有分析思路,最后灵光一现,发现Fields里面有这个mTarget的所有属性值,咱们可以通过这个找到对应的线索,点击Fields,如下截图:

看到这个是不是脑瓜子嗡嗡的了,小伙伴们,不要着急,咱们接合References里面的内容来找,如下截图:

以上两张图一对比是不是就一目了然了,在Activity根目录中找到Class,然后一步一步展开,就能跟References意义对应上,到了这一步就好分析了,References中只是引用关系,具体属性值不知道,那样就不能精准定为问题了,现在有了Fields目录下的详细属性值,咱们就能知道具体是哪个对象泄露了,现在咱们展开Fields目录下对应的mTarget对象,截图如下:

以上框出来的都是常用属性值,可以用来快速定位具体是哪个view泄露了,mBackground,如果你设置了view背景,就可以在这个里面看到背景的资源id,那样就可以通过id去代码中找到在哪些view引用了,如果这个背景资源有多个地方引用,那还可以结合其他属性值一起判断,比如mChildren这个对象,mTarget是个容器,里面有几个子控件,这样就可以通过子控件跟资源id结合起来精准判断了。以下是我项目的截图:

通过以上信息就能快速在代码中找到对应的view

找到对应的view后,再到代码里面找执行动画的地方,如下截图:

以上红框就是执行动画的view,接着进入AnimUtils看方法floatBtnOut,代码如下:

发现view被mSlideOut对象持有了,通过代码看mSlideOut是个静态对象,我们都知道静态对象的生命周期是跟进程一样的,activity销毁静态对象不一定被销毁,到了这咱们分析就告一段落了,接下来就是解决了,解决方法也很简单,要么去掉静态对象,要么在activity销毁的时候主动释放mSlideOut,这样都能解决内存泄露问题,没个人解决方法不一样,这个就不多说了,主要分享的是分析解决问题的方法,希望这一篇对小伙伴们分析解决内存泄露问题有用,如果觉得有用就点个赞吧!谢谢了


http://www.kler.cn/a/504346.html

相关文章:

  • 台湾省村里边界2018年4月更新arcgis数据shp格式内容分析测评
  • Unity ShaderGraph中Lit转换成URP的LitShader
  • 【数学】概率论与数理统计(四)
  • docker run一个镜像如何指定最大可使用的内存大小、cpu大小
  • 一.项目课题 <基于TCP的文件传输协议实现>
  • Linux下杂项设备驱动的编写
  • Elasticsearch技术标准解析与实践案例
  • 软路由如何实现电脑手机一机一IP
  • springboot 根据UUID生成唯一的短链接
  • 如何学好数据结构?
  • 大数据原生集群 (Hadoop3.X为核心) 本地测试环境搭建二
  • 如何备考PostgreSQL中级认证
  • 统计有序矩阵中的负数
  • STM32第6章、WWDG
  • linux stdout/stderr重定向到文件,>或tee
  • 小结:华为交换机常用的操作指令
  • 43.Textbox的数据绑定 C#例子 WPF例子
  • Spring MVC复杂数据绑定-绑定数组
  • 13:00面试,13:08就出来了,问的问题有点变态。。。
  • 2025最新JAVA面试八股文【基础篇】