这里我们通过一个例子来学习Memory Monitor工具的使用。
示例
package com.android.test;
import android.content.Context;
public class UserManger {
public static UserManger instance;
private Context mContext;
private UserManger(Context context) {
mContext = context;
}
public static UserManger getInstance(Context context) {
if (instance == null) {
instance = new UserManger(context);
}
return instance;
}
}
package com.android.test;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
UserManger mUserManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mUserManager = UserManger.getInstance(this);
}
}
我们在之前的学习中有说过,
内存泄漏产生的原因:当一个对象已经不需要再使用了,本该被回收时,但是因为有另外一个对象持有它的引用,从而导致对象不能被回收,这种导致本该被回收的对象不能被回收而停留在堆内存中,就会产生内存泄漏。
上面的代码就是一个单例模式内存泄漏的场景,那么这篇博客的目的就是如何把代码中的内存泄漏找出来。
分析上面的代码,我们知道发生泄漏的不是UserManager,而是MainActivity,知道为什么吗?因为UserManager中有一个静态成员instance,其生命周期和应用程序的生命周期是一致的,当退出应用时,才会被销毁;当MainActivity退出时,有可能发生GC,GC时就会回收MainActivity,因为MainActivity的对象(this)被UserManager对象所引用,UserManager本身是不能被干掉的,所有就会发生内存泄漏。
Memory Monitor
Android Studio自导的Memory Monitor可以方便的观察堆内存的分配情况,并且可以粗略的观察有没有发生Memory Leak。