iOS && AndroidAndroid技术知识Android知识

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使用方法再另行分析。
上一篇下一篇

猜你喜欢

热点阅读