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

面试常见问题: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. 看完这篇,让你不再惧怕内存优化

    对于安卓应用开发来说,内存究竟会遇到什么样的问题,有什么方法可以用来测试和分析,以及有什么样的策略可以去实践优化,今天就来好好聊聊这个话题. ​ 缘起 现代计算机是基于冯*诺依曼架构的,计算机的软件是 ...

  2. Android面试-Android性能优化和内存优化、APP启动速度一线大厂的实战案例解析

    一.Android 内存管理机制 二.优化内存的意义 三.避免内存泄漏 四.优化内存空间 五.图片管理模块的设计与实现 六.总结 深入探索Android内存优化 第一章.重识内存优化 第二章.常见工具 ...

  3. android内存优化面试,帮助程序员提高核心竞争力的30条建议

    前言 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百度.小米.乐视.美团.58.猎豹.360.新浪.搜狐等一线互联 ...

  4. 安全管家安卓_内存优化管家v1.0下载-内存优化管家app最新版下载

    内存优化管家是一款安卓手机多功能清理工具,包含了文件垃圾.缓存垃圾.广告垃圾和内存垃圾等分类清理功能,使用方法简单,一键扫描手机,即可进行不同类型的垃圾划分, 用户可以根据需求进行筛选清理,除此之外, ...

  5. 安卓图片内存优化(一)——图片占用内存大小的计算

    安卓开发中经常会遇到因为图片处理不当导致的oom问题,因为系统分配给每个应用的最大内存空间是有限的,正常只有几十上百兆(排除通过特殊手段获取到几百兆内存空间的情况).所以为了节省更多的空间需要对图片进 ...

  6. 安卓手机内存优化调研

    一 背景 现在安卓手机在相机操作下,不可避免要大量消耗内存资源,同时当今手机如同电脑一样,前台相机,后台各种app进程,都会消耗内存.因而会出现相机场景下,系统可用内存不足,内存压力增加不少,对相机性 ...

  7. 安卓内存优化-bitmap优化

    Bitmap常用方法: public boolean compress 将位图的压缩到指定的OutputStream,可以理解成将Bitmap保存到文件中! format:格式,PNG,JPG等: q ...

  8. 2018安卓面试经历

    首先声明一下,以下部分答案是我自己答得,有不对的地方,大家可以在评论区改正,共同成长. 多点面试题 1.解决大图片加载卡顿问题    先使用默认图占位,加载小图 然后再加载大图  2.长图压缩 3.经 ...

  9. ANDROID内存优化(大汇总——中)

    转载请注明本文出自大苞米的博客(http://blog.csdn.net/a396901990),谢谢支持! 写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上 ...

最新文章

  1. SQL操作语句中的注意点
  2. 反射效果,自己公司内部编码,在text上输入内容后,通过输入内容查询数据库,弹出下拉框
  3. 机器人学习--图解激光SLAM
  4. 神奇的 Object.defineProperty 解释说明
  5. 11集成计划的制定与实施
  6. android 按钮事件添加事件吗,android为按钮添加事件的三种方法
  7. linux HUSTOJ 一些页面修改
  8. 视频 | 直升机如何转弯,为什么能悬停在空中,它的飞行原理是什么?
  9. 淘宝刷单怎么刷?买手黑号为什么会成为黑号?
  10. 冲刺大厂每日算法面试题,动态规划21天——第七天
  11. VSCode绿豆沙主题,爱护你的眼睛,丢掉深色背景
  12. 《CMS后台系统》项目实战 详细分解
  13. PATA1034题解
  14. SAP笔记MM (中文版学习)
  15. STM32工程文件结构详解
  16. 静态网页之--小说阅读网
  17. 2022年5月20号对数据库的操作课时二:
  18. 如何培养《未来架构师》(2)
  19. 蓝桥杯 算法训练 Cowboys DP
  20. 墨天轮访谈 | 华为云温云博:从客户视角出发,GaussDB(for Redis)究竟“香”在哪里?

热门文章

  1. 康柏v3322安装linux系统,SUN的服务器能安装Linux操作系统吗
  2. canopy算法流程_python实现Canopy算法
  3. SunGard Global trading Presentation
  4. POI 读取word (word 2003 和 word 2007
  5. 服务器更换主板影响,关于x86服务器主板更换导致一系列问题解决
  6. 长江后浪推前浪,不学SpringBoot就会被拍到沙滩上
  7. svn服务器迁移部分文件缺失,SVN仓库迁移(将一个仓库从一台服务上上转移到另一服务器上)...
  8. mqtt 域名连接_Modicon M262通过MQTT连接阿里云实现
  9. go语言基础语法-切片
  10. 毕业设计商城后台管理系统