从「内存抖动」说起

  • 面试官:你做过性能优化是吧。
  • 面试者:嗯是的,在卡顿和耗电问题上做过挺多事。
  • 面试官:内存抖动的解决方案你有了解过吗?
  • 面试者:内存什么? 面试官:内存抖动。没有听过吗?
  • 面试者:……没有。
  • 面试官:呼(摇头)。年轻人还是要敬畏技术啊,要持续学习啊。
  • 面试者:我……嗯……

Android性能优化解析-内存抖动 附:《Android性能优化指南》_android

什么是内存抖动?

在程序里,每创建一个对象,就会有一块内存分配给它;每分配一块内存,程序的可用内存也就少一块;当程序被占用的内存达到一定临界程度,GC 也就是垃圾回收器(Garbage Collector)就会出动,来释放掉一部分不再被使用的内存。

Android 里的 View.onDraw() 方法在每次需要重绘的时候都会被调用,这就意味着,如果你在 onDraw() 里写了创建对象的代码,在界面频繁刷新的时候,你就也会频繁创建出一大批只被使用一次的对象,这就会导致内存占用的迅速攀升;然后很快,可能就会触发 GC 的回收动作,也就是这些被你创建出来的对象被 GC 回收掉。

[垃圾内存]太多了就被清理掉,这是 Java 的工作机制,这不是问题。问题在于,频繁创建这些对象会造成内存不断地攀升,在刚回收了之后又迅速涨起来,那么紧接着就是又一次的回收,对吧?这么往复下来,最终导致一种循环,一种在短时间内反复地发生内存增长和回收的循环。

Android性能优化解析-内存抖动 附:《Android性能优化指南》_android_02

这种循环往复的状态就像是水波纹的颤动一样,它的专业称呼叫做 Memory Churn,Android 的官方文档里把它翻译做了内存抖动。所以内存抖动其实并不是我们的内存在整体地进行摇晃这样神奇的事情,而仅仅是类似有一根搅拌棒轻轻地在内存的边界上进行搅动的样子——其实翻译成「内存搅动」好像也行哈?

怎么解决内存抖动

他没听过你可以告诉他呀!不是不能问内存抖动,而是如果你问了之后对方表示没听过,你应该进一步引导,比如你问他:那么,Android 官方建议我们不要在 onDraw() 里[创建对象]你知道吗?你知道为什么吗?如果他立即回答这会导致频繁触发内存回收,那不是证明他其实懂原理的吗?这时候你再告诉他,这就叫内存抖动,就行了。

而且也不要局限于这一个词,你还可以继续问:为什么在 onDraw() 里创建对象导致的结果是内存抖动而不是内存溢出?这种对于能力的考察比对词汇的考察重要多了。其实我也不是很确定这个问题是不是每个喜欢问内存抖动的面试官们都能回答上来,但这样问才是考察程序员能力的最好方式。

如果你在面试时问了内存抖动,但在对方表示没听过之后,你就不再进行任何的引导而是直接给对方扣了分,那你其实相当于在问:我这里有一个高端词汇,您听过吗?

说回到本质,学技术要学本质,但内存抖动并不是任何技术的本质。其实我今天也并不是在聊内存抖动这个词本身,而是想表达一种观点:

我们学技术,应该学得深,而且应该足够深,但不要被各种花里胡哨的词吓到,也不要被它们带着跑,我们要有自己的知识体系,有自己的成长逻辑。

那么关于性能优化的知识点有哪些呢?

性能优化相关知识点

Android性能优化解析-内存抖动 附:《Android性能优化指南》_移动开发_03

360°Android全方面性能调优

《Android性能优化指南》

Android性能优化解析-内存抖动 附:《Android性能优化指南》_移动开发_04

这里给大家分享一份《Android性能优化指南》,这份资料是整理了业内腾讯技术团队、阿里巴巴技术团队、美团技术团队、爱奇艺技术团队、得到技术团队、携程技术团队、蘑菇街技术团队等性能监控实战中遇到的问题以及解决方案。从各个方面对目标产品进行全方位的“优化”,让产品的性能得到提升。

  • 文中所有资料都是免费分享给大家的,扫一扫下方CSDN官方认证二维码免费获取↓↓↓

深入探索Android 稳定性优化

  • 第—章、正确认识
  • 第二章、Crash优化
  • 第三章、ANR优化
  • 第四章、移动端业务高可用方案建设
  • 第五章、稳定性长效治理
  • 第六章、稳定性优化问题

Android性能优化解析-内存抖动 附:《Android性能优化指南》_android_05

深入探索Android启动速度优化

  • 一、启动优化的意义
  • 二、应用启动流程
  • 三、启动耗时检测
  • 四、启动优化常规方案启动过程中的常见问题

Android性能优化之内存优化

  • 一、Android 内存管理机制
  • 二、优化内存的意义
  • 三、避免内存泄漏
  • 四、优化内存空间
  • 五、图片管理模块的设计与实现
  • 六、总结

Android性能优化解析-内存抖动 附:《Android性能优化指南》_性能优化_06

深入探索Android内存优化

  • 第一章、重识内存优化
  • 第二章、常见工具选择
  • 第三章、Android内存管理机制回顾
  • 第四章、内存抖动
  • 第五章、内存优化体系化搭建
  • 第六章、内存优化演进
  • 第七章、内存优化工具
  • 第八章、内存问题总结
  • 第九章、内存优化常见问题

Android性能优化解析-内存抖动 附:《Android性能优化指南》_移动开发_07

Android性能优化 —实战解析篇

  • 第一章、对字符串匹配算法的一点理解
  • 第二章、安卓APP崩溃捕获方案———xCrash
  • 第三章、深入理解Gradle框架之一:Plugin,Extension, buildSrc
  • 第四章、Android H5首屏优化实践
  • 第五章、任意URL跳转漏洞修复与JDK中getHost()方法之间的坑
  • 第六章、支付宝客户端架构解析:Android_客户端启动速度优化之「垃圾回收l
  • 第七章、支付宝App构建优化解析:通过安装包重排布优化Android 端启动性能
  • 第八章、支付宝App构建优化解析:Android包大小极致压缩
  • 第九章、深入理解Flutter多线程
  • 第十章、携程技术—从智行Android项目看组件化架构实践
  • 第十一章、Flutter您需要知道的知识点
  • 第十二章、二维码扫描优化
  • 第十三章、AOP技术在客户端的应用与实践
  • 第十四章、互联网产品决策秘笈:AB测试
  • 第十五章、Android Native 内存泄漏系统化解决方案
  • 第十六章、Android P之Smart Linkify
  • 第十七章、百度App组件化之路
  • 第十八章、百度App网络深度优化系列《三》弱网优化
  • 第十九章、深入理解gradle框架之二:依赖实现分析
  • 第二十章、Probe: Android线上OOM问题定位组件

Android性能优化解析-内存抖动 附:《Android性能优化指南》_性能优化_08

  • 第二十一章、Android静态代码扫描效率优化与实践
  • 第二十二章、Scene: Android开源页面导航和组合框架
  • 第二十三章、网易新闻客户端H5秒开优化
  • 第二十四章、解决支付宝包体积优化的遗留问题:运行时获取dexpc
  • 第二十五章、Android篇│爱奇艺App启动优化实践分享
  • 第二十六章、二维码扫描优化及爱奇艺App的实践
  • 第二十七章、动态下发so库在Android APK安装包瘦身方面的应用
  • 第二十八章、史上最全Android渲染机制讲解(长文源码深度剖析)
  • 第二十九章、花椒Android端自动化测试实践
  • 第三十章、一种简单优雅的TextView行间距适配方案
  • 第三十一章、Android 10分区存储介绍及百度APP适配实践
  • 第三十二章、抖音BoostMultiDex优化实践: Android低版本上APP首次启动时间减少80%
  • 第三十三章、抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)
  • 第三十四章、携程Android 10适配踩坑指南
  • 第三十五章、抖音包大小优化-资源优化
  • 第三十六章、Gradle 与 Android构建入门
  • 第三十七章、AwCookieManager.nativeGetCookie crash排查
  • 第三十八章、开源|BoostMultiDex:挽救Android Dalvik 机型APP升级安装体验
  • 第三十九章、字节跳动技术团队—另类BadTokenException问题分析和解决
  • 第四十章、LayoutInflater原理分析与复杂布局优化实践
  • 第四十一章、今日头条Android '秒级编译速度优化

Android性能优化解析-内存抖动 附:《Android性能优化指南》_性能优化_09

  • 第四十二章、曾梦想if-else走天涯?看看"麦任树模式"优化
  • 第四十三章、谷歌—协程中的取消和异常│异常处理详解
  • 第四十四章、QQ音乐—彻底弄懂浏览器缓存策略
  • 第四十五章、闲鱼如何在2个月内实现Android启动速度翻倍的?
  • 第四十六章、Android Camera内存问题剖析
  • 第四十七章、有赞移动Crash平台建设
  • 第四十八章、贝壳APP Top Experience系列|Android方法耗时统计工具
  • 第四十九章、抖音Android性能优化系列:Java内存优化篇
  • 第五十章、QQ音乐Android编译提速之路
  • 第五十一章、移动端UI—致性解决方案
  • 第五十二章、Android D8编译器" bug"导致Crash的问题排查
  • 第五十三章、今日头条ANR优化实践系列–设计原理及影响因素
  • 第五十四章、今日头条ANR优化实践系列–监控工具与分析思路
  • 第五十五章、全民k歌适配arm64-v8a方案
  • 第五十六章、全民K歌内存篇1——线上监控与综合治理
  • 第五十七章、全民K歌内存篇2——虚拟内存浅析
  • 第五十八章、全民K歌内存篇3———native内存分析与监控
  • 第五十九章、一种按照library的维度进行Android包大小分析的方法和实践
  • 第六十章、网易新闻构建优化:如何让你的构建速度"势如闪电"?
  • 第六十一章、美团—设计稿(UI视图)自动生成代码方案的探索

Android性能优化解析-内存抖动 附:《Android性能优化指南》_java_10

最后

Android架构师之路很漫长, 一起共勉吧!

学习之路犹如逆水行舟,不进则退,如果你松懈了, 那么你就退步了,而在Android开发工作中没有一门吃香独特的技术,想拿高薪也只能是望尘莫及的。做个勤奋向上的人,加紧学习,抓住中心,宁精勿杂,宁专勿多。