Android Studio内存泄露分析
2016-03-15 本文已影响377人
stefanli
从Eclipse转移到Android Studio,性能分析以及内存分析那一套都需要跟着转移,这里主要介绍使用Android Studio分析内存泄露情况。
首先创建一个Android应用,构造一个简单的内存泄露场景:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CommonUtil.getInstance(this);
}
}
public class CommonUtil {
private static CommonUtil mInstance;
private Context mContext;
private CommonUtil(Context context) {
mContext = context;
}
public static CommonUtil getInstance(Context context) {
if (mInstance == null) {
mInstance = new CommonUtil(context);
}
return mInstance;
}
}
很显然,这个地方因为单例咬住了MainActivity的引用,单例生命周期同进程生命周期,所以这个地方会出现内存泄露。
然后打开Android Studio -> Android Monitor -> Memory,进入应用再返回桌面,一次或多次操作,然后点击GC,再dump出堆栈文件。
dump出的.hprof文件在Captures目录下,点开文件可以看到相应的内存信息,但个人觉得这里的信息并不方便分析内存泄露问题,我们可以右键点击文件,导出标准的.hprof文件(必须转换,不然独立版本的MAT识别不了)
最后下载MAT,导入.hprof文件,愉快的开始分析内存,因为是用android studio开发,这里选择Stand-alone Eclipse RCP Applications版本,独立运行,不依赖于Eclipse。
接下来,我们看到的就是很熟悉的界面了,通过包名筛选,没有被回收的对象一目了然:
可以看到,MainActivity对象并没有被回收,的确出现了内存泄露,具体的MAT使用方法再另行分析。