安卓面试之轻松战胜内存优化问题
Posted 大厂我来了
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓面试之轻松战胜内存优化问题相关的知识,希望对你有一定的参考价值。
熟悉如何内存优化,无疑是安卓工程师进阶的一个必要条件,同时也是面试的重点和难点。
面试常见问题: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格式的图片,或者减少应用总缓存的大小;可以减少动画的复杂度甚至是关闭动画,提高流畅度。
优化数据结构
平时代码注意点
深入浅出讲解安卓原理,海量安卓面试题,获取大厂一手咨询,请扫码关注公众号:
以上是关于安卓面试之轻松战胜内存优化问题的主要内容,如果未能解决你的问题,请参考以下文章