前言
性能优化是一个老生常谈的问题,也一直是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