常用内存监控工具
- Android Profiler:Android Studio 自带的性能分析工具,可实时监控 CPU、内存、网络等性能指标。
- LeakCanary:专门用于检测 Android 应用内存泄漏的开源库,使用简单,能快速定位泄漏点。
- MAT(Memory Analyzer Tool):一个功能强大的 Java 堆内存分析工具,可深入分析内存使用情况。
使用 LeakCanary 检测内存泄漏的基本步骤
- 引入依赖:在项目的
build.gradle
文件中添加 LeakCanary 依赖:
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'
releaseImplementation 'com.squareup.leakcanary:leakcanary-android-no-op:2.8.1'
- 初始化:在
Application
类的 onCreate
方法中初始化 LeakCanary,对于 Kotlin 项目,代码如下:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (LeakCanary.isInAnalyzerProcess(this)) {
return
}
LeakCanary.install(this)
}
}
- 触发检测:正常使用应用,当发生内存泄漏时,LeakCanary 会自动检测到并在通知栏提示。点击通知可查看详细的泄漏信息,包括泄漏的对象、引用链等。
原理
- 弱引用与引用队列:LeakCanary 使用
WeakReference
和 ReferenceQueue
来监控对象的生命周期。当一个对象只有弱引用指向它时,在垃圾回收时,这个对象会被回收,同时其对应的弱引用会被放入引用队列。
- 堆转储(Heap Dump):当怀疑有内存泄漏时,LeakCanary 会触发一次堆转储,获取当前内存中所有对象的信息。
- 分析引用链:从引用队列中取出弱引用,通过分析堆转储数据,构建对象的引用链。如果发现某个对象存在从 GC Roots 到该对象的强引用链,说明该对象无法被回收,可能发生了内存泄漏。然后 LeakCanary 会展示这条引用链,帮助开发者定位泄漏源头。