Android 开发高手课
张绍文
前微信高级工程师,Tinker 负责人
52721 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 62 讲
导读 (1讲)
模块一 高质量开发 (25讲)
Android 开发高手课
15
15
1.0x
00:00/00:00
登录|注册

04 | 内存优化(下):内存优化这件事,应该从哪里着手?

课后作业
总结
内存监控
内存泄漏
Bitmap优化
设备分级
内存优化

该思维导图由 AI 生成,仅供参考

在掌握内存相关的背景知识后,下一步你肯定想着手开始优化内存的问题了。不过在真正开始做内存优化之前,需要先评估内存对应用性能的影响,我们可以通过崩溃中“异常退出” 和 OOM 的比例进行评估。另一方面,低内存设备更容易出现内存不足引起的异常和卡顿,我们也可以通过查看应用中用户的手机内存在 2GB 以下所占的比例来评估。
所以在优化前要先定好自己的目标,这一点非常关键。比如针对 512MB 的设备和针对 2GB 以上的设备,完全是两种不同的优化思路。如果我们面向东南亚、非洲用户,那对内存优化的标准就要变得更苛刻一些。
铺垫了这么多,下面我们就来看看内存优化都有哪些方法吧。

内存优化探讨

那要进行内存优化,应该从哪里着手呢?我通常会从设备分级、Bitmap 优化和内存泄漏这三个方面入手。
1. 设备分级
相信你肯定遇到过,同一个应用在 4GB 内存的手机运行得非常流畅,但在 1GB 内存的手机就不一定可以做到,而且在系统空闲和繁忙的时候表现也不太一样。
内存优化首先需要根据设备环境来综合考虑专栏上一期我提到过很多同学陷入的一个误区:“内存占用越少越好”。其实我们可以让高端设备使用更多的内存,做到针对设备性能的好坏使用不同的内存分配和回收策略。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了移动应用开发中的内存优化方法,主要从设备分级、Bitmap优化和内存泄漏三个方面入手。首先,针对不同设备采取不同的内存分配和回收策略,以综合考虑内存占用。其次,通过统一图片库和监控来有效控制图片内存占用。最后,建立持续的监控机制来排查和解决内存泄漏问题。文章还介绍了内存监控的采集方式和计算指标,以及GC监控的方法。在总结部分,强调了在进行内存优化前需要明确优化目标和应用现状,以及提到了内存优化的“必杀技”作业。整体而言,本文为读者提供了全面的内存优化指导,涵盖了实际操作和监控方法,对移动应用开发者具有重要参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Android 开发高手课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(81)

  • 最新
  • 精选
  • 孙鹏飞
    置顶
    看评论有部分同学对内存这两篇的内容主题提出了疑问,说是内存优化的主题关注内存监控的内容太多了。邵文同学已经在下面的评论里有部分回复了,我这里总结一下原因。首先我们并没有很直接的去给出很多优化的案例,比如评论里提到的hook gc来避免gc引起的memory churn的技术,或者常见的引起内存泄漏几种情况的解决、数据结构优化(arraymap等),更换序列化方案,view复用,object pool等优化方法,也没有具体的去讲解内存相关的操作系统概念和Android虚拟机heap space的结构和allocator的执行原理,这些内容大部分网上有很多不错的帖子进行了很详细的讲解,而且限于篇幅我们把内容关注在我们经常遇到的问题上,就是我们如何去监控不当的内存使用,比如发生OOM或者短时间频繁的GC产生卡顿的时候,如果我们没有具体的内存监控信息是无法判断产生问题的原因,这也是我们在实际工作中遇到的问题,也是这两篇内容关注的点,如果同学有想了解的内容可以在留言里提出来,看大家具体对哪些文章里没有提到的内容感兴趣,可以讨论一下。
    2018-12-09
    1
    31
  • 内存优化的主题是监控?

    作者回复: 内存优化有两个部分,一个是架构,这里包括设备分级,缓存管理,进程管理与Bitmap图片库的策略。 另外监控的确是最重要的,因为大部分的内存问题,特别是内存泄露,oom。更多的时候难点不在于解决,而在于如何发现它们。

    2018-12-08
    28
  • [etartnecnoC]H
    说下看了几篇文章的感受,可能确实是实力差距,看完后感觉实用性太差,都是讲的一些高大上的理论和市面上大部分公司都用不到的东西,没有一个循序渐进的过程或者引导,毕竟交钱来参加高手课的水平大部分都是菜鸟啊。楼上有个建议很好,讲这篇文章前先把一些用到的基础知识贴一下链接。看来真的是高手课,高到云端了,很难触及的那种。

    编辑回复: 非常感谢你的反馈,很好的意见,已和作者沟通调整。

    2018-12-21
    3
    24
  • 0928
    感觉主题有一点跑偏,在监控内存泄露的前提下,应该从怎么防止内存泄露着手,我感觉会更实用,因为监控不是每个公司都涉及的,但是防止内存泄露应该是每个程序员应该必备的。我感觉可以多来一点实现思路和怎么预防泄露已经常见的一些泄露点。 虽然网上有很多帖子可看,但是有以下一些问题,零散、正确性、思路、如何验证等等问题,既然大家都来买课我想也是奔着课程的专业程度来的,所以我感觉作者在深入的同时也不要忘记一些实用的东西分享。及时是因为篇幅的问题,我感觉可以通过其他链接的方式引入。 拜托!

    作者回复: 怎么说呢,单从内存泄露可能就有各种各样的场景,不同应用情况也不一样。 在有限的边幅里面,我这边更加希望大家可以触达底层,这些问题的本质是怎么样?如何去发现它们,怎么样构造自己的测试体系。 当然后面也会考虑多加入一些参考链接

    2018-12-10
    13
  • jacob
    您好,如何确定是bitmap重复图片呢,遍历所有像素点比较吗,是不是太重了

    作者回复: 这个重复bitmap分析是在服务器后台做的,目前是对所有bitmap数组直接计算hash的方法匹对

    2018-12-08
    10
  • Seven
    平时在做图片优化的时候,主要用inSampleSize控制图片大小,将大图片调整到合适的大小,毕竟是google推荐的方案。 总结一下我今天学到的关于内存优化的东西 设备分级:根据设备的高级程度(综合考虑)使用最佳的实践方式; 控制进程数量(看到有节操的保活会心一笑); 注意控制包大小; 图片优化:统一管理,统一监控; 重复图片:一个一个对比像素肯定不现实,比尺寸刷一波,再比像素,先取一个像素点,估计这一步就能刷掉很多不同的图片,然后在剩下的图片继续用这种方式(或者增加像素点),不知道可行性高不高(待定),应该有更好的方式; 内存泄漏:先第三方框架查漏,时机成熟后及时还“技术债务”; 内存监控:查找内存占有率,尽量做到“用完就走”,不占资源。 “技术债务”真是一个好词,平时一点一点的还肯定比遇到紧急情况加班加点的还要好的多。 抛个问题:相似图片是不是也应该丢弃,相识图片又要怎么判断呢?

    作者回复: 相似图片的确也有人搞过,但是是线下自动化时。 如果判断相似图片是非常成熟的算法,可以在网上搜到很多资料。

    2018-12-08
    9
  • Androider
    项目里先后换过几次实现长连接的方式,包括Netty,现在使用MQTT实现长连接功能,我们知道MQTT 用于物联网的居多,我们使用后导致OOM的概率一下上去了,您对这个有什么看法呢?或者有什么实现稳定的长连接的方式,我们主要做拍卖项目,对价格的实时更新要求比较高。谢谢了。

    作者回复: mqtt不是非常清楚,微信使用的是mars,这个已经开源。 长连另外一个比较通用的方式是使用http2.0,后面的架构篇我们会有专门的讲

    2018-12-09
    3
    5
  • Origin
    从上一节课就一直在讲第三方或者一些自动化监控的工具,就像昵称是“灰”的听众说的一样,“内存优化的主题是监控”吗?没有讲到根本的东西啊,就算是Android开发的高手课,内容的思路和逻辑上也要建立在最基础的东西上吧?没有一个从基础上升到高层次的一个过程,相信会有越来越多的听众难以接受了。

    作者回复: 不知道这位同学说的根本和基础指的是哪些内容?是指pss rss uss这些的区分,以及low memory killer机制,内存分配原理这些吗? 因为内存这个话题已经很老了,网上和android developer都有大量这些内容,文中也给了一些参考资料。 内存优化文中其实讲了两部分内容,一部分是架构上的设计,例如设备分级,统一缓存,进程管理,以及图片库的使用。 另外主要讲的的确是监控,因为大部分的内存问题,比如泄露,某一时间分配过大,oom。他们其实解决都不难,难得是如何快速的发现它们。 也欢迎指出其他的意见

    2018-12-08
    2
    4
  • 薯条
    大佬,询问一个问题,我发现在8.0 android手机上,不同界面重复使用一个图片,通过api setImageResource 设置。其实内存大小并没有变化,android系统内部已经帮我们去重了。多个界面,多次setImageResource 相同的图片引用。都是复用一个图片的。所以不理解你说的 “图片去重复”的优化。能否告知下

    作者回复: 指的是同一张图片,createbitmap多次。。在实际开发过程中,我们创建Bitmap的方式有很多种,不仅仅是setImageResource

    2019-09-14
    2
    3
  • Keep up
    大佬,想问下文中提到的“大图片监控”在线上环境如何部署思路,是用插桩方式在 比如 setBitmap 方法后拿到bitmap和view的宽高做比较,还是定时地去获取内存快照中view和bitmap的宽高作比较,还是其他方式?不胜感激~

    作者回复: 我们是采用后者的

    2019-08-06
    3
    3
收起评论
显示
设置
留言
81
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部