- Memory Analyzer工具使用
- 项目地址与使用说明
- 分析实例
2.1 Android Studio中通过Android Profiler工具生成后缀为hprof的二进制文件;
2.2 通过Android Sdk自带的转换工具hprof-conv.exe将上面AS生成的hprof文件转化为MAT工具可以识别的hprof文件,命令行为:
hprof-conv inputfile.hprof outfilename.hprof
需要将inputfile.hprof文件拷贝到sdk的platform-tools目录下。
2.3 主要通过MAT中的Histogram和dominator_tree工具结合分析如图所示
- Leak Canary开源框架使用
1. Leak Canary项目地址
2. Leak Canary介绍:LeakCanary本质上是一个基于MAT进行Android应用程序内存泄漏自动化检测的的开源工具,我们可以通过集成LeakCanary提供的jar包到自己的工程中,一旦检测到内存泄漏,LeakCanary就好dump Memory信息,并通过另一个进程分析内存泄漏的信息并展示出来,随时发现和定位内存泄漏问题,而不用每次在开发流程中都抽出专人来进行内存泄漏问题检测,极大地方便了Android应用程序的开发。
3. Leak Canary配置使用
3.1 在application中的oncreate中对Leak Canary初始化
if (LeakCanary.isInAnalyzerProcess(this)) {
return;
}
LeakCanary.install(this);
3.2 在build.gradle 中添加依赖
debugImplementation 'com.squareup.leakcanary:leakcanary-android:1.6.2'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:1.6.2'
// Optional, if you use support library fragments:
debugImplementation 'com.squareup.leakcanary:leakcanary-support-fragment:1.6.2'
- 内存泄漏需要关注的点
- 核心思想,或者说要注意的问题是,非静态的内部类持有外部类的引用
- 造成内存泄漏的点:handler内部类,Time,TimerTask,内部匿名线程、AsyncTask内部类、单例模式持有activity的上下文;BroadCastReceiver、ContentObserver、FileObserver、Cursor、Callback在activity或者其他UI界面销毁时没有unregisiter或者close掉,否则,activity可能被system强引用,而在强引用时内存是无法释放的。
- 参考资料