本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布
前言
先通俗理解下内存泄漏,内存溢出,OOM,GC回收这几个概念。
把app的堆内存空间想成了一个杯子,内存就是里面的水。
当你的app启动后,系统会分配给app一个堆空间,起始不会很大比如是32M(根据你的app启动时的内存申请为准)
image.png
随着程序的运行对象的创建越来越多,系统不断加内存分配:32M -> 64M -> ...
而GC回收则会定时扫描内存,发现不被引用的对象即可回收。
正常来说你的app堆内存会有升有降。
此时如果有某个Activity持有某个引用,在onDestroy时还不把这个引用设为null,那么返回进入退出这个界面,Activity就会创建很多次从而存在多个实例,导致堆内存直升不降!这就叫做内存泄漏。
当用户重复这个操作或者有多个不同Activity内存泄漏时,app运行一段时间堆内存超过系统规定的最大值 heapSize,杯子满了就会发现内存溢出(OOM),app崩溃。
关键点
通过上面这个例子,我们知道查找内存泄漏有如下几点关键点:
如何知道你的app上限值heapSize是多少
什么情况导致无法GC
怎么复现是哪个界面内存泄漏
下面通过一个实例来演示,如何借助AndroidStudio查找内存泄漏: