谈一谈Android内存优化那些事(三)Android内存分析与
由于内容比较多,我从三个方面分为三篇对Android内存优化进行介绍:(前两篇之前已经提过了)
1.Android内存分配与回收机制
2.Android常用的内存优化方法
3.Android内存分析与监控
<meta charset="utf-8">
上两篇文章我们说完了内存分配与回收机制、内存优化的问题,那么事后的内存分析和监控是必不可少的了!下面我们就介绍一下内存分析与监控。
Android内存分析与监控
Android内存分析和监控主要介绍如下四种方式:
- 查看GC日志
- 查看内存使用情况
- 通过LeakCanary监控内存 泄漏
- 线上监控
1.查看GC日志
GC的类型:
Concurrent
: 不会暂停应用线程的并发垃圾回收。此垃圾回收在后台线程中运行,而且不会阻止分配。
Alloc
: 您的应用在堆已满时尝试分配内存引起的垃圾回收。在这种情况下分配线程中发生了垃圾回收。
Explicit
:由应用明确请求的垃圾回收,例如,通过调用system.gc()。与 Dalvik 相同,在 ART 中,最佳做法是您应信任垃圾回收并避免请求显式垃圾回收(如果可能)。不建议使用显式垃圾回收,因为它们会阻止分配线程并不必要地浪费 CPU 周期。如果显式垃圾回收导致其他线程被抢占,那么它们也可能会导致卡顿(应用中出现间断、抖动或暂停)
NativeAlloc
:原生分配(如位图或 RenderScript 分配对象)导致出现原生内存压力,进而引起的回收。
查看垃圾回收日志
在AndroidStudio Logcat过滤GC,然后操作App一段时间后会出现上图的GC内容:
垃圾回收原因+垃圾回收的名称+释放对象+释放对象大小+释放大型对象的大小+堆统计数据+暂停时间
LOS objects
是前面所说到的Art虚拟机新增的着重关注最后面的暂停时间,超过16ms会影响界面,一般大于700ms会影响体验,Android Vitals 将连续丢帧超过 700 毫秒定义为冻帧,也就是42帧
2.查看内存使用情况
通过查看内存使用情况来分析App的内存占用是非常必要的,下面分别介绍如下两种方式:
- adb shell
- Profiler
查看内存使用情况
详细的使用请参考AndroidDeveloper调查RAM使用情况
使用Profiler分析内存
AndroidStudio的Profiler功能越来越强大,不仅集成了内存分析,还有电量、CPU、网络等数据的分析。
如何通过Profiler进行内存的分析,如何找到内存泄漏请查看
使用 Memory Profiler 查看 Java 堆和内存分配
这里要说下,Android官网的很多文章都被翻译成了中文,这对国内的开发者来说越来越有好了,但要注意中文翻译的文章会比较滞后,最新版一般都是英文。
3. 使用LeakCanary监控内存泄漏
LeakCanary名字的由来
:Canary是煤矿中金丝雀表达的参考,暗示了矿工将随身携带进入矿井隧道的笼养金丝雀(鸟类)。如果在矿井中收集到一氧化碳等危险气体,这些气体会在杀死矿工之前杀死金丝雀,从而提供警告立即离开隧道。
原理
:LeakCanary通过ApplicationContext统一注册监听的方式,通过application.registerActivityLifecycleCallbacks来绑定Activity生命周期的监听,从而监控所有Activity; 在Activity执行onDestroy时,开始检测当前页面是否存在内存泄漏,并分析结果。KeyedWeakReference与ReferenceQueue联合使用,在弱引用关联的对象被回收后,会将引用添加到ReferenceQueue;清空后,可以根据是否继续含有该引用来判定是否被回收;判定回收, 手动GC, 再次判定回收,采用双重判定来确保当前引用是否被回收的状态正确性;如果两次都未回收,则确定为泄漏对象。
LeakCanary的问题
:LeakCanary也有一定的不确定性,一般同一个地方反复泄漏5次,算是一个泄漏,同时不建议用在线上环境。
详细查看?Github
4.线上监控
线上的内存监控一般都是一些大公司在做,例如美团的Probe还有微信最近开源的Matrix,个人觉得这个可以去了解下,大公司用户数多时会用到,小公司App接入必要性不是很大,一般来说把上面的介绍的部分做好了就足够了。
推荐阅读
谈一谈Android内存优化那些事(一)内存分配与回收机制
谈一谈Android内存优化那些事(二)Android常用的内存优化方法
最后
一点题外话:
之前答应大家整理的资料都整理好了
点击:
《Android学习PDF+架构视频+面试文档+源码笔记》(不是本人发放)
来获取学习资料提升自己去挑战一下
当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。