Android开发高手课
张绍文
前微信高级工程师,Tinker负责人
立即订阅
12609 人已学习
课程目录
已完结 61 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 焦虑的移动开发者该如何破局?
免费
导读 (1讲)
导读 | 如何打造高质量的应用?
模块一 高质量开发 (25讲)
01 | 崩溃优化(上):关于“崩溃”那些事儿
02 | 崩溃优化(下):应用崩溃了,你应该如何去分析?
03 | 内存优化(上):4GB内存时代,再谈内存优化
04 | 内存优化(下):内存优化这件事,应该从哪里着手?
05 | 卡顿优化(上):你要掌握的卡顿分析方法
06 | 卡顿优化(下):如何监控应用卡顿?
06补充篇 | 卡顿优化:卡顿现场与卡顿分析
07 | 启动优化(上):从启动过程看启动速度优化
08 | 启动优化(下):优化启动速度的进阶方法
09 | I/O优化(上):开发工程师必备的I/O优化知识
10 | I/O优化(中):不同I/O方式的使用场景是什么?
11 | I/O优化(下):如何监控线上I/O操作?
12 | 存储优化(上):常见的数据存储方法有哪些?
13 | 存储优化(中):如何优化数据存储?
14 | 存储优化(下):数据库SQLite的使用和优化
15 | 网络优化(上):移动开发工程师必备的网络优化知识
16 | 网络优化(中):复杂多变的移动网络该如何优化?
17 | 网络优化(下):大数据下网络该如何监控?
18 | 耗电优化(上):从电量优化的演进看耗电分析
19 | 耗电优化(下):耗电的优化方法与线上监控
20 | UI 优化(上):UI 渲染的几个关键概念
21 | UI 优化(下):如何优化 UI 渲染?
22 | 包体积优化(上):如何减少安装包大小?
23 | 包体积优化(下):资源优化的进阶实践
24 | 想成为Android高手,你需要先搞定这三个问题
模块二 高效开发 (9讲)
25 | 如何提升组织与个人的研发效能?
26 | 关于编译,你需要了解什么?
27 | 编译插桩的三种方法:AspectJ、ASM、ReDex
28 | 大数据与AI,如何高效地测试?
29 | 从每月到每天,如何给版本发布提速?
30 | 数据评估(上):如何实现高可用的上报组件?
31 | 数据评估(下):什么是大数据平台?
32 | 线上疑难问题该如何排查和跟踪?
33 | 做一名有高度的移动开发工程师
模块三 架构演进 (9讲)
34 | 聊聊重构:优秀的架构都是演进而来的
35 | Native Hook 技术,天使还是魔鬼?
36 | 跨平台开发的现状与应用
37 | 移动开发新大陆:工作三年半,移动开发转型手游开发
38 | 移动开发新大陆:Android音视频开发
39 | 移动开发新大陆: 边缘智能计算的趋势
40 | 动态化实践,如何选择适合自己的方案?
41 | 聊聊Flutter,面对层出不穷的新技术该如何跟进?
42 | Android开发高手课学习心得
练习Sample跑起来 (8讲)
练习Sample跑起来 | 热点问题答疑第1期
练习Sample跑起来 | 热点问题答疑第2期
练习Sample跑起来 | 热点问题答疑第3期
练习Sample跑起来 | 热点问题答疑第4期
练习Sample跑起来 | ASM插桩强化练习
练习Sample跑起来 | 唯鹿同学的练习手记 第1辑
练习Sample跑起来 | 唯鹿同学的练习手记 第2辑
练习Sample跑起来 | 唯鹿同学的练习手记 第3辑
特别放送 (7讲)
Android JVM TI机制详解(内含福利彩蛋)
专栏学得苦?可能是方法没找对
专栏学得苦?可能你还需要一份配套学习书单
Native下如何获取调用栈?
聊聊Framework的学习方法
Android工程师的“面试指南”
程序员修炼之路 | 设计能力的提升途径
结束语 (1讲)
结束语 | 移动开发的今天和明天
Android开发高手课
登录|注册

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

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

内存优化探讨

那要进行内存优化,应该从哪里着手呢?我通常会从设备分级、Bitmap 优化和内存泄漏这三个方面入手。
1. 设备分级
相信你肯定遇到过,同一个应用在 4GB 内存的手机运行得非常流畅,但在 1GB 内存的手机就不一定可以做到,而且在系统空闲和繁忙的时候表现也不太一样。
内存优化首先需要根据设备环境来综合考虑,专栏上一期我提到过很多同学陷入的一个误区:“内存占用越少越好”。其实我们可以让高端设备使用更多的内存,做到针对设备性能的好坏使用不同的内存分配和回收策略。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Android开发高手课》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(70)

  • 孙鹏飞 置顶
    看评论有部分同学对内存这两篇的内容主题提出了疑问,说是内存优化的主题关注内存监控的内容太多了。邵文同学已经在下面的评论里有部分回复了,我这里总结一下原因。首先我们并没有很直接的去给出很多优化的案例,比如评论里提到的hook gc来避免gc引起的memory churn的技术,或者常见的引起内存泄漏几种情况的解决、数据结构优化(arraymap等),更换序列化方案,view复用,object pool等优化方法,也没有具体的去讲解内存相关的操作系统概念和Android虚拟机heap space的结构和allocator的执行原理,这些内容大部分网上有很多不错的帖子进行了很详细的讲解,而且限于篇幅我们把内容关注在我们经常遇到的问题上,就是我们如何去监控不当的内存使用,比如发生OOM或者短时间频繁的GC产生卡顿的时候,如果我们没有具体的内存监控信息是无法判断产生问题的原因,这也是我们在实际工作中遇到的问题,也是这两篇内容关注的点,如果同学有想了解的内容可以在留言里提出来,看大家具体对哪些文章里没有提到的内容感兴趣,可以讨论一下。
    2018-12-09
    16
  • 极客米
    文哥,看了二楼和三楼的回答,感觉他们想表达的意思学习是一个循序渐进的过程,一上来就“跳级式”的领讲搞的大家很慌,因为毕竟大多数人的水平没这么高,很多人可能都是一脸懵逼的进来,一脸懵逼的出去。而你所说的有些网上都有很成熟的帖子或者文章,但是能在看这篇文章的时候去搜的又能有几个呢?我提个建议哈,就是开讲的过程中,如果需要打基础的知识,能不能贴个链接,引导式学习
    2018-12-10
    77
  • [etartnecnoC]H
    说下看了几篇文章的感受,可能确实是实力差距,看完后感觉实用性太差,都是讲的一些高大上的理论和市面上大部分公司都用不到的东西,没有一个循序渐进的过程或者引导,毕竟交钱来参加高手课的水平大部分都是菜鸟啊。楼上有个建议很好,讲这篇文章前先把一些用到的基础知识贴一下链接。看来真的是高手课,高到云端了,很难触及的那种。

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

    2018-12-21
    15
  • 内存优化的主题是监控?

    作者回复: 内存优化有两个部分,一个是架构,这里包括设备分级,缓存管理,进程管理与Bitmap图片库的策略。

    另外监控的确是最重要的,因为大部分的内存问题,特别是内存泄露,oom。更多的时候难点不在于解决,而在于如何发现它们。

    2018-12-08
    13
  • 0928
    感觉主题有一点跑偏,在监控内存泄露的前提下,应该从怎么防止内存泄露着手,我感觉会更实用,因为监控不是每个公司都涉及的,但是防止内存泄露应该是每个程序员应该必备的。我感觉可以多来一点实现思路和怎么预防泄露已经常见的一些泄露点。

    虽然网上有很多帖子可看,但是有以下一些问题,零散、正确性、思路、如何验证等等问题,既然大家都来买课我想也是奔着课程的专业程度来的,所以我感觉作者在深入的同时也不要忘记一些实用的东西分享。及时是因为篇幅的问题,我感觉可以通过其他链接的方式引入。

    拜托!

    作者回复: 怎么说呢,单从内存泄露可能就有各种各样的场景,不同应用情况也不一样。

    在有限的边幅里面,我这边更加希望大家可以触达底层,这些问题的本质是怎么样?如何去发现它们,怎么样构造自己的测试体系。

    当然后面也会考虑多加入一些参考链接

    2018-12-10
    10
  • csdpz
    如果看不懂,可以多看几遍,再不懂那可能是相关的知识储备不够了,建议再去补补基础,反正这课买了又不会跑,以后还能看。

    与我而言,了解了大厂是如何细粒度的进行监控的,感受到了差距,得到了一点启发,收货满满
    2018-12-16
    8
  • Victory
    感觉自己目前的能力还不能完全考虑到性能方面,只能保证尽量不使用重复代码,完成功能,不出bug……
    2018-12-09
    6
  • Seven
    平时在做图片优化的时候,主要用inSampleSize控制图片大小,将大图片调整到合适的大小,毕竟是google推荐的方案。

    总结一下我今天学到的关于内存优化的东西
    设备分级:根据设备的高级程度(综合考虑)使用最佳的实践方式;
    控制进程数量(看到有节操的保活会心一笑);
    注意控制包大小;
    图片优化:统一管理,统一监控;
    重复图片:一个一个对比像素肯定不现实,比尺寸刷一波,再比像素,先取一个像素点,估计这一步就能刷掉很多不同的图片,然后在剩下的图片继续用这种方式(或者增加像素点),不知道可行性高不高(待定),应该有更好的方式;
    内存泄漏:先第三方框架查漏,时机成熟后及时还“技术债务”;
    内存监控:查找内存占有率,尽量做到“用完就走”,不占资源。

    “技术债务”真是一个好词,平时一点一点的还肯定比遇到紧急情况加班加点的还要好的多。

    抛个问题:相似图片是不是也应该丢弃,相识图片又要怎么判断呢?

    作者回复: 相似图片的确也有人搞过,但是是线下自动化时。

    如果判断相似图片是非常成熟的算法,可以在网上搜到很多资料。

    2018-12-08
    6
  • Juinn
    我觉得shaowen老师讲的很好,总体思路和框架已经出来,剩下是自己补充技术细节了,这才是高手课。
    2018-12-22
    4
  • 后撤步三分
    简单说下感受,老师的确在内存优化上没有提供过多实质的方案,而是从底层去分析内存和监控内存,间接提供不一样思维角度,觉得很赞。 不过确实是有点深度,可能对很多应用层开发看着有点吃力,前几篇就这么深奥难懂,不知会不会降低某些人的兴趣,但是对我而言,就喜欢这么有深度内容,而不是重复网上一些文章的内容。
    2019-01-11
    3
  • Androider
    项目里先后换过几次实现长连接的方式,包括Netty,现在使用MQTT实现长连接功能,我们知道MQTT 用于物联网的居多,我们使用后导致OOM的概率一下上去了,您对这个有什么看法呢?或者有什么实现稳定的长连接的方式,我们主要做拍卖项目,对价格的实时更新要求比较高。谢谢了。

    作者回复: mqtt不是非常清楚,微信使用的是mars,这个已经开源。

    长连另外一个比较通用的方式是使用http2.0,后面的架构篇我们会有专门的讲

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

    作者回复: 不知道这位同学说的根本和基础指的是哪些内容?是指pss rss uss这些的区分,以及low memory killer机制,内存分配原理这些吗?

    因为内存这个话题已经很老了,网上和android developer都有大量这些内容,文中也给了一些参考资料。

    内存优化文中其实讲了两部分内容,一部分是架构上的设计,例如设备分级,统一缓存,进程管理,以及图片库的使用。

    另外主要讲的的确是监控,因为大部分的内存问题,比如泄露,某一时间分配过大,oom。他们其实解决都不难,难得是如何快速的发现它们。

    也欢迎指出其他的意见

    2018-12-08
    3
  • 朱蓝天
    很多实验室环境或者开发环节就能发现的问题,目前大一点的厂都能搞得定,但是想要继续深入优化,将离线工具分析发现问题的模式变成线上实时监控发现问题,这正是很多厂需要的内容。
    2018-12-11
    2
  • jacob
    您好,如何确定是bitmap重复图片呢,遍历所有像素点比较吗,是不是太重了

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

    2018-12-08
    2
  • 条野太郎
    问个很菜的问题,监控到重复图片之后要怎么去重?
    2019-08-20
    1
    1
  • yuxufeng
    这是网上找不到的干货,仔细体会,必然收货满满啊
    2019-06-02
    1
  • cupcake
    oom其中一种原因是超过线程数量超过上限,排查起来有难度

    作者回复: 可以参考崩溃分析的,将所有的线程名输出到日志中

    2019-02-20
    1
    1
  • 古月弓虽1993
    使用haha获取堆的时候,除了 app heap ,为什么还要取default heap 呢?

    作者回复: 这块要看看虚拟机的内存管理,看看哪部分的内存会放到default中。当时其实参考的是haha的写法,并没有深究

    2019-01-20
    1
  • 司冬
    您好,我想问一个实际的问题,比如我的一个应用里面有一个对象泄漏了,但这个对象的大小很小,比如只有十几K,那么我们怎么找出这个对象呢?

    作者回复: Hprof或者火焰图都可以,如果一个对象泄露10几k比较难找,但是我们一般找的是大头,如果这个10k的对象泄露了1000个,我们就很容易找出来

    2018-12-20
    1
  • 牵手约定
    收获了一波知识。
    2018-12-08
    1
收起评论
70
返回
顶部