Android 内存优化使用profile 和 MAT 工具进行内存泄漏检测

本文介绍了Android内存优化的重要性,包括内存抖动、内存泄漏和内存溢出的概念。通过使用Android Studio的Profile工具检测内存状况,并通过MAT工具进行深入的内存泄漏分析。文章详细阐述了如何预防内存泄漏,如使用软引用和弱引用,并提供了解决内存泄漏的实战步骤,包括MAT工具的配置和使用。
摘要由CSDN通过智能技术生成

内存抖动 & 内存泄漏 & 内存溢出(OOM)
内存抖动

含义:短时间内有大量对象创建销毁,它伴随着频繁的GC。

查看:可以使用android studio自带的profile工具检测。

现象:在profile中的内存图像就像是心电图一样,忽上忽下,如下图所示:

在这里插入图片描述

常见场景:循环使用字符串拼接,比如我们项目的日志打印等

预防内存抖动方法:

避免在循环中创建对象,能复用的尽量复用。
避免在频繁调用的方法中创建对象,如自定义view中的onDraw()等方法中创建画笔。
获取对象尽量从对象池中获取,如Handler获取Message对象应使用obtain()方法获取了。

内存泄漏

程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费。
长生命周期对象持有短生命周期对象强引用,从而导致短生命周期对象无法被回收!

查看:使用profile工具检测内存情况,重复执行进入然后退出一个activity,看activity实例是否还存在。如果activity实例还存在,很可能就出现了内存泄漏。

现象:反复进入A,然后退出A ,执行三次,可以看到A 的实例存在两个。如下图,VideoPlayerActivity:

在这里插入图片描述

这就说明我们的activity并没有被销毁,至少目前是这样的。至于究竟会不会内存泄漏,就需要接下来使用另一款工具配合使用了。

如何判断内存泄漏:

使用可达性分析法

通过一系列称为“GC Roots”的对象作为起始点,从这些节点向下搜索,搜索所有的引用链,当一个对象到GC Roots没有任何引用链(即GC Roots到对象不可达)时,则证明此对象是不可用的。也就会被回收。

在这里插入图片描述

何为GC Roots 对象,一般静态变量就是gc root对象,可以理解成生命周期很长的对象。

如何预防内存泄漏:

使用 软引用、弱引用间接的持有对象的引用。

软引用:

定义一些还有用但并非必须的对象。对于软引用关联的对象,GC不会直接回收,而是在系统将要内存溢出之前才会触发GC将这些对象进行回收。

弱引用 :

同样定义非必须对象。被弱引用关联的对象在GC执行时会被直接回收。

造成内存泄漏的常见场景:

使用集合时,例如add一个监听器,我们必须要手动remove掉。
使用静态成员变量/单利对象时,如果持有短生命周期对象的引用(Activity)将导致短生命周期对象无法被释放。
进行文件io操作时,没有close()。最好写在finally{ }里面;
android 系统bug、第三方类库造成的内存泄漏。

内存溢出

内存溢出(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件

频繁的出现内存抖动或者大量内存泄漏很有可能就会导致内存溢出(OOM)。

Android 中的垃圾回收器 CMS

android 中使用的垃圾回收器 叫做CMS ,下面简单介绍下他的垃圾回收算法。

新生代对象

新生代对象采用的是复制算法,当大对象也可能直接进入老年代。

老年代对象

老年代对象采用的是标记-清除

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安卓兼职framework应用工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值