Android内存泄漏检测与MAT使用

本文介绍了Android内存泄漏的基本概念、检测工具及实战分析。重点讲解了LeakCanary、DDMS和MAT的使用,特别是MAT的支配树、SHALLOWHEAP和RETAINED HEAP等概念,通过案例展示了如何利用MAT分析内存泄漏,帮助开发者理解和解决内存管理问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

公司相关项目需要进行内存优化,所以整理了一些分析内存泄漏的知识以及工作分析过程。
本文中不会刻意的编写一个内存泄漏的程序,然后利用工具去分析它。而是通过介绍相关概念,来分析如何寻找内存泄漏,并附上自己的项目实战过程。
撰写过程中,本人深感JVM、操作系统相关知识了解不够深刻,不足之处非常欢迎指正说明。

内存泄漏基本概念

内存检测这部分,相关的知识有JVM虚拟机垃圾收集机制,类加载机制,内存模型,以及操作系统的基础知识(所以不要说JVM有啥用,操作系统有啥用啦 :) )。
编写没有内存泄漏的程序,对提高程序稳定性,提高用户体验具有重要的意义;同时,也是java程序员进阶的重要内容。利用java编写程序的时候,要特别注意内存泄漏相关的问题。虽然JVM提供了自动垃圾回收机制,但是还是有很多情况会导致内存泄漏。
内存泄漏主要原因就是一个生命周期长的对象,持有了一个生命周期短的对象的引用。这样,会导致短的对象在该回收时候无法被回收。Android中比较典型的有:
1、静态变量持有Activity的context。
2、或者Handler持有某个组件的context,同时如果Looper的消息队列中有针对该Handler的消息没有被处理,那么会被作为target持有强引用,最终的导致context无法释放,导致相应组件在退出时无法被内存回收。
3、非静态内部类默认持有外部类的引用。有时候为了方便,我们会在Activity中定义一个Thread内部类,同时直接通过new Thread的方式去运行线程,那么在线程运行结束之前,线程都会持有Activity的引用,从而导致Activity无法被释放。


内存检测工具

LeakCananry

使用步骤

LeakCanary,主要监测的是使用过程中Activity,Fragment等组件是否没被内存回收。使用方法也十分简单,相当于装了一个监听器,然后通过正常 操作去寻找内存泄漏,发生内存泄漏的时候会有Toast,同时可以在相应程序查看哪里发生内存泄漏。
方法比较简单,具体步骤可以查阅官方github。添加leakcanary依赖以后,新建一个Application入口,在Oncreate方法中安装Leakcanary即可。
这里写图片描述
当发生内存泄漏时,屏幕会出现Toast,同时打开桌面上的Leaks程序,显示泄漏的内存,如下图:
这里写图片描述

整体流程

LeakCananry实现步骤大致是:
实现大致步骤是:
1、自动把activity加入到KeyedWeakReference
2、在background线程中,检查onDestroy后reference是否被清除,且没有触发gc
3、如果reference没有被清除,则dump heap到一个hprof文件并保存到app文件系统中
4、在一个单独进程中启动HeapAnalyzerService,HeapAnalyzer使用HAHA来分析heap dump。
5、HeapAnalyzer在heap dump中根据reference key找到KeyedWeakReference。
6、HeapAnalyzer计算出到GC Roots的最短强引用路径来判断是否存在泄露,然后build出造成这个泄露的引用链。
7、结果被传回来app进程的DisplayLeakService,并展示一个泄露的notification。

结论

方法的优点是简单易行,但是只能检测Activity、Fragment是否发生内存泄漏。 对于一些项目比如sdk开发,很可能整个程序没有一个Activity,所以这种方式就不是很实用。


观看整体内存使用情况

详情参见官方文档:
https://developer.android.com/studio/profile/investigate-ram.html#ViewingAllocations
使用adb shell,进入手机adb,执行命令:

dumpsys meminfo 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值