Android内存泄漏终极解决篇(上)

2019-12-10 19:22:04王旭

上述的代码存在内存泄漏,new Runnable(){}是一个非静态的匿名内部类,所以它会强引用创建它的外围对象LeakAty,我们来测试一下内存泄漏的过程,开启手机的方向旋转功能,不断地旋转手机,让LeakAty不断地创建新的实例。理论上如果不存在上述泄漏的代码,之前的Activity会在onDestory之后被回收内存。而一旦存在上述泄漏的代码,新创建的Ruannale实例会一直处于运行状态,它不会被回收,而它强引用的LeakAty当然也不会被回收,所以在屏幕不断旋转,之前创建的LeakAty就不会被释放,会导致旋转n次,内存中就存在n+1个的LeakAty实例。 
Heap工具第一次按下Cause GC按钮的截图: 

Android内存泄漏终极解决篇(上)

上图的data object的Total Size的大小为1.031M。经过多次的旋转屏幕之后,我们再看一下截图

Android内存泄漏终极解决篇(上)

Total Size变成了2.059M,从1.031M到2.059M,每次调用GC的过程中data object的总大小没有回落,所以可以证实上面的代码确实是存在内存泄漏的问题,那么泄漏发生在哪里?答案可以通过MAT工具来分析得到。

三、内存泄漏的分析工具MAT

要通过MAT分析,需要提供一个.hprof文件。我们可以通过”Dump HPROF file”按钮转存当前的堆内存信息。我们将其保存为1.hprof。

Android内存泄漏终极解决篇(上)

导出的1.hprof的格式需要通过..sdktools目录下的hprof-conv.exe工具进行转换才能被MAT成功导入,我们将其转换成out1.hprof 
Android内存泄漏终极解决篇(上)