安卓面试之轻松战胜内存优化问题

熟悉如何内存优化,无疑是安卓工程师进阶的一个必要条件,同时也是面试的重点和难点。

面试常见问题:1、如何优化内存; 2、如何加载10M大小的图片; 3、如何线上监控内存

为什么要优化内存

移动设备中,内存是非常重要的资源;如果内存使用不当,轻则出现卡顿,重则出现程序崩溃:

如何发现内存问题

环境:Android Studio 4.1

工具:AS内部集成的Profiler

内存检测

1、打开Android Studio性能检测工具Profiler,可以获取到当前应用的内存动态使用情况:

2、运行中如果发现内存总量是呈锯齿状缓慢上升的,一般情况是出现了内存泄漏,导致内存无法被回收。

3、点击Dump,可以获取到当前应用的内存快照,里面有标识了总内存,以及Java、Native、图片占用内存情况。

4、获取到当前内存快照后,最新版本的Profile还能检测到哪些对象出现内存泄漏,已经对象的引用链,很容易可以发现代码中出现的问题。

5、点击Record按钮,也可以监控一段时间内的内存使用情况

线上监控

监控内存的异常率也是获取应用质量的必要方法,也是很多公司考察KPI的指标之一。

在生产中,不大可能去监测是否出现了内存泄漏,一般采用定时采集数据的方法,获取当前内存的使用情况,比如总内存,PSS物理内存,图片内存等;

一般可以采用几分钟内采集一次内存数据,根据内存占用率,可以计算内存的异常率;

一般内存占用超过85%程序异常率会大大上升。

内存 UV 异常率 = PSS 超过 400MB 的 UV / 采集 UV

在生产环境中,需要监控内存的异常情况和触顶率,也可以监控不同版本的内存使用情况,一旦出现异常率出现大的上升,则可以提供预警让相应开发优化代码,不要等到应用已经被吐槽卸载了才意识到内存问题。

内存优化手段

避免出现内存泄漏

在开发过程和测试过程中,可以采用LeakCanary工具检测内存泄漏;有条件的情况下,也可以泄漏时将当前内存快照上传到平台,由平台分析内存泄漏的引用链,并通知给对应的开发人员。

图片优化

图片的使用不当也是内存问题的重要原因,特别是在列表控件中如果使用不当,很容易引起OOM异常。

统一图片库

要收拢图片的调用,这样我们可以做整体的图片控制策略,比如针对低端机,可以采用565 格式和更加严格的缩放算法,以减少内存的占用量。图片库可以使用 Glide、Fresco 或者采取自研都可以。而且需要进一步收拢 Bitmap.createBitmap、BitmapFactory 相关的接口。

图片处理

比如一张1920*1080的图片,仅仅只是放在一个120*80的imageview控件里面,势必造成内存的浪费,要根据控件大小合理缩小图片。

首先,要获取到图片所需尺寸;

BitmapFactory.Options options = new BitmapFactory.Options();
//inJustDecodeBounds为true,不会加载图片到内存中
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.hugeimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

其次,按需配置decodeResource参数BitmapFactory.Options的inSampleSize采样和inPreferredConfig图片格式值。

//配置sample值,对图片进行缩放
mOptions.inSampleSize = sampleValue;
//配置分辨率
 mOptions.inPreferredConfig = Bitmap.Config.RGB_565;

监控重复图片

有后台情况下,将内存快照上送后,可以在平台对所有bitmap数组直接计算Hash的方法进行匹对,以获取是否有图片被重复加载。

设备分级

巧妇难为无米之炊,可以针对设备的性能情况来使用不同的内存使用策略。

比如针对1G的内存,可以使用565格式的图片,或者减少应用总缓存的大小;可以减少动画的复杂度甚至是关闭动画,提高流畅度。

优化数据结构

平时代码注意点

深入浅出讲解安卓原理,海量安卓面试题,获取大厂一手咨询,请扫码关注公众号: 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大厂我来了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值