OOM!又是OOM!Android 内存监控一定要注意!
Posted BUGgogogo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OOM!又是OOM!Android 内存监控一定要注意!相关的知识,希望对你有一定的参考价值。
前言
性能优化是一个老生常谈的问题,也一直是android中高级攻城狮进阶和深入的方向。
在性能优化的各种问题中,内存泄漏一直占有较重要的地位。
内存泄漏的积累会造成内存溢出,进而导致程序崩溃,出现OOM问题。
针对这个问题,我们需要在上线前进行检测同时也要能够实现线上的监控。
方案一:线下性能监控
Android Studio自身提供的MAT等工具分析内存泄漏比较耗时,因而诞生了LeakCanary——这也是现在寻找内存泄漏问题最常用的工具。
LeakCanary 这个工具非常简单,依赖 LeakCanary 库,可自动检测内存泄漏并通过通知报警,不用初始化。但是经过对它的深入分析之后,不难发现,简单的API后面藏着许多复杂的逻辑处理原理。
面试的时候,面试官也不会问“使用”相关的没有技术含量的东西,一般只会问原理,比如:
1.说一下LeakCanary检测内存泄漏的原理与基本流程
2.LeakCanary是如何初始化的?
3.说一下LeakCanary是如何查找内存泄露的?
下面简单说一下 LeakCanary 的原理(面试必问的,建议收藏):
1.监听 Activity 的生命周期;
2.在 onDestroy 的时候,创建相应的 Refrence 和 RefrenceQueue,并启动后台进程去检测;
3.一段时间之后,从 RefrenceQueue 读取,若读取不到相应 activity 的 Refrence,有可能发生泄露了,这个时候,再促发 gc,一段时间之后,再去读取,若在从 RefrenceQueue 还是读取不到相应 activity 的 refrence,可以断定是发生内存泄露了;
4.发生内存泄露之后,dump,分析 hprof 文件,找到泄露路径(使用 haha 库分析);
5.存储结果并使用通知提醒用户存在泄漏。
这里用一张图片来直观的描述 LeakCannary 的执行流程。
其中,比较重要的是如何确定是否发生内存泄露,而如何确定发生内存泄露最主要的原理是通过 Refrence 和 RefrenceQueue。
这里只做一个总体的介绍,详细具体的流程可以往下看。
方案二:线上性能监控
LeakCanary 是为线下内存泄漏 debug 而准备的,但是在实际的工作中,只知道线下性能监控是远远不够的。
如下图:
错误发生在 b.xf 第五行,导致OOM的原因,到底是此处申请了太大的内存,还是其他地方申请了太多内存导致可用内存不足亦或者程序存在内存抖动问题,导致连续内存不足,我们不得而知。
这时候线上应用性能监控的重要性就体现出来了。
如果我们能够对应用上线后的各项性能进行监控,在出现问题时能提取监控数据,从而定位到存在性能问题的地方快速解决,这不香吗?
我们通过与腾讯内部专家进行沟通知道,腾讯内部正在使用JVMTI进行线上内存监控,内存优化上,高级的JVMTI监控对象分配,然后形成日志传送到服务器端,这正是我们需要的线上监控内存的技术方案!
性能监控详解
用过Android和ios的朋友应该印象比较深,相比于iOS,Android用的时间越长就会越卡。
在这个网络都追求5G了的时代,“卡”这个体验显然成为了一个极拉低印象分的问题。
不仅是阿里,还有腾讯、字节跳动、爱奇艺等大厂,小厂也是,都非常重视这个问题,在面试中,如果这个方向表现优异,你将会很值钱。
本文针对“性能优化”这个技术点,献上一份 Android性能优化的详细攻略,从各个方面对目标产品进行全方位的“优化”,让产品的性能从各个方面得到提升,希望对大家的学习和工作有所帮助。
App性能优化提要:
性能优化知识技能策略详解
性能优化这个点的知识要想讲明白篇幅会比较长,鉴于篇幅原因,我这里直接把详解部分整理成了一份PDF。
这份《超全App性能优化知识技能手册》一共有721页,4个大点,25个小章节,不仅仅有详细的底层原理的解析,还有专门的实践案例
// Wechat number(可复制):
study5233
(另外还有一个系列配套的性能优化专题的讲解视频需要的可以一起打包)
第一章 设计思想与代码质量优化
-
六大原则(单一职责原则、里氏替换原则、依赖倒转原则、接口隔离原则……)
-
设计模式:结构型模式(桥接模式、适配器模式、装饰器模式、代理模式、门面(外观)模式……),创建型模式(建造者模式、单例模式、抽象工厂模式、工厂方法模式……)
-
数据结构(数组、栈、队列、链表、树……)
-
算法(排序算法、查找算法……)
第二章 程序性能优化
-
启动速度与执行效率优化(冷启动和热启动解析、APP 启动黑白屏解决办法、APP 卡顿问题分析及解决方案、启动速度与执行效率优化之 StrictMode……)
-
布局检测与优化(布局层级优化、过度渲染……)
-
内存优化(内存抖动和内存泄漏、内存大户,Bitmap 内存优化、Profile 内存监测工具、Mat 大对象与泄漏检测、耗电优化、网络传输与数据存储优化网络传输与数据存储优化、APK 大小优化、屏幕适配……)
-
耗电优化(Doze&Standby、Battery Historian、JobScheduler、WorkManager、)
-
网络传输与数据存储优化(google 序列化工具 protobuf、7z 极限压缩……)
-
APK 大小优化(APK 瘦身、微信资源混淆原理……)
-
屏幕适配(进行适配的原理、屏幕分辨率限定符与 smallestWidth 限定符适配原理、为什么选择 smallestWidth 限定符适配、怎么适配其他 module、常见问题处理……)
-
OOM 问题原理解析(adj 内存管理机制、JVM 内存回收机制与 GC 算法解析、生命周期相关问题总结、Bitmap 压缩方案总结……)
-
ANR 问题解析(AMS 系统时间调节原理、程序等待原理分析、ANR 问题解决方案……)
-
Crash 监控方案(Java 层监控方案、Nativie 层监控方案……)
第三章 开发效率优化
-
分布式版本控制系统 Git(企业高效持续集成平台场景介绍、GIT 分布式版本控制系统、GIT 分支管理……)
-
自动化构建系统 Gradle: Gradle 与 Android 插件(gradle 与 android gradle 插件的关系、Gradle Transform API 的基本使用……), Gradle Transform API 的基本使用(什么是 Transform、Transform 的使用场景、Transform API 学习、输入的类型……) 自定义插件开发(Gradle 插件简介、开始准备、实践、自定义 Gradle 插件、buildSrc 模块方式……) 插件实战(多渠道打包、发版自动钉钉……)
第四章 APP 性能优化实践
- 启动速度(应用启动的一般流程、冷启动和热启动、启动速度的测量、启动窗口优化、线程优化、系统调度优化、GC 优化、IO 优化、资源重排、主页布局优化、类加载优化、选择合适的启动框架、减少 Activity 的跳转层次、厂商优化、后台保活……)
-
流畅度(性能问题分析的一些工具和套路、通过性能数据数据分析、Android 平台性能导致的性能案例、Android App 自身导致的性能问题、低内存的数据特征和行为特征、应用宝、讯飞输入法无障碍服务导致的整机卡顿分析、字节跳动:今日头条图文详情页秒开实践……)
-
抖音在 APK 包大小资源优化的实践(图片压缩、webp 无侵入式兼容、多 DPI 优化、重复资源合并、shrinkResource 严格模式、资源混淆(兼容 aab 模式)、ARSC 瘦身……)
- 优酷响应式布局技术全解析(优酷APP响应式布局技术概述、优酷APP响应式布局Android落地、在分发场景的落地、在消费场景的落地、优酷APP响应式布局之测试方案……)
-
网络优化(手机淘宝在网络的链路优化、百度 APP 在网络深度优化的实践……)
-
手机淘宝双十一性能优化项目揭秘(一秒法则的实现、启动时间和页面帧率提升 20%、Android 手机内存节省50%……)
-
高德 APP 全链路源码依赖分析(高德 APP 平台架构、基础实现原理、项目架构、应用场景及实现原理……)
-
彻底干掉OOM的实战经验分享(排查内存泄漏、兜底策略、内存峰值太高、特大图排查优化……)
-
微信 Android终端内存优化实践(Activity 泄露检测、Bitmap 分配及回收追踪、Native 内存泄漏检测、线程监控、内存监控……)
总结
如果你也想提升自己移动开发的性能优化技术,或者是正在准备移动开发岗的面试,我觉得这份笔记你必定不能错过。
// Wechat number(可复制):
study5233
相信大家认真看完,跟着走一遍,就对 Android 内存监控,APP性能调优有了自己的理解。
加油!
以上是关于OOM!又是OOM!Android 内存监控一定要注意!的主要内容,如果未能解决你的问题,请参考以下文章