使用Android Profiler、LeakCanary,检查Activity/Fragment的引用链。
-
1.Capture head dump(捕获堆转储)
点击 Record 按钮,2s后自动生成当前时间的Java内存快照,这里会显示出发生内存泄漏的对象 -
2.Record native allocations(记录native内存分配)
记录一段时间 native 的内存分配情况 -
3.Record Java/Kotlin allocations(记录Java/kotlin内存分配)
记录一段时间 Java/Kotlin 的内存分配情况
1.要查看的堆
view app heap
view zygote heap
view image heap
view JNI heap
一般我们只关注 app heap ,因为这是你的应用分配的内存, 其它两个不是。
2.分组方式
Arrange by class 按照类分组
Arrange by package 按照包分组
Arrange by callstack 按照堆栈分组
3.类的筛选
show all classes 展示所有的类
show activity/fragment leaks 展示发生泄漏的类
show project classes 仅展示app的类,对应app heap
结果中的一些名词解释
- Allocations: 已经分配的对象数量
- Native Size: 对象在原生内存分配的字节
- Shallow Size: 对象本身占用的Java内存,不包含其它对象引用
- Retained Size: 当该对象被回收时,可同时被回收的实例的 Shallow Size 之和(包括自己)
Retained Size 需要重点关注
Retained Size<Shallow Size:说明此对象内部有实例被其它对象引用,无法全部释放
Retained Size=Shallow Size:说明此对象没有引用其它对象,也没有被引用
Retained Size>Shallow Size:说明此对象引用了其它对象