MAT 是 Memory Analyzer Tool 的简称,它是一款强大的内存分析工具,使用它能帮助开发者快速分析内存泄漏以及优化内存的使用。
内存泄漏也是我们开发过程中经常碰到的问题,掌握了MAT工具,那么你就不会惧怕内存泄漏,使用它可以让内存泄漏无所遁形。
MAT下载
进入网址下载MAT工具,如果你使用 Eclipse 开发工具而且已经集成了插件,可以不用下载了。
场景准备
我们用下面的代码产生一个内存泄漏的场景:
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(mInnerClassInstance == null){
mInnerClassInstance = new InnerClass();
}
mInnerClassInstance.testFunc();
}
public static InnerClass mInnerClassInstance;
class InnerClass{
public void testFunc(){
Log.e("InnerClass", "InnerClass.testFunc()");
}
}
我们知道,在 Java 中,非静态内部类会默认隐性引用外部类对象。而上面的例子中的静态变量mInnerClassInstance
在第一个MainActivity
实例创建后便会一直存在,那么它就会一直持有MainActivity
的一个引用,在MainActivity
实例销毁后它是无法被回收的,因此便造成了内存泄漏。
内存泄漏的初步分析
首先可以用adb shell dumpsys meminfo <包名>
先进行初步的分析。
我们按下手机的后退键回到桌面,这时会调用MainActivity
的onDestroy()
,正常情况下MainActivity
实例会被回收。
$ adb shell dumpsys meminfo com.example.hq.testsomething
Applications Memory Usage (kB):
Uptime: 23692543 Realtime: 23692543
** MEMINFO in pid 29474 [com