首先写个内存泄漏的例子:单例模式
import android.content.Context;
/**
* @Author: david.lvfujiang
* @Date: 2019/12/5
* @Describe: 单例模式
*/
public class JavaBean {
private static JavaBean bean;
private Context context;
private static JavaBean javaBean;
public JavaBean(Context context) {
this.context = context;
}
public static JavaBean createBean(Context context) {
if (javaBean == null) {
javaBean = new JavaBean(context);
return javaBean;
}
return javaBean;
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
//创建单例对象
JavaBean javaBean = JavaBean.createBean(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, Main2Activity.class);
startActivity(intent);
finish();
}
});
}
}
上诉的单例对象持有Activity的引用,然后我们在Activity中创建单例对象,之后我们跳转到第二个Activity,然后调用finsh方法销毁Activity。
1.点击 Profiler > MEMORY
2.进入MEMORY界面后点击删除按钮手动进行GC,再点击删除按钮右边的按钮进行内存分析,会出现如下界面
3.选择搜索的方式是根据包名,然后找到我们的Activity
点击Activity后右边会出现一个窗口,点击该对象就可以看到它在内存中的引用情况
说明我们的Actiivty被JavaBean这个单例类持有引用
我们再给Activity添加一个匿名的线程类看看
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button = findViewById(R.id.button);
//创建单例对象
JavaBean javaBean = JavaBean.createBean(this);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(MainActivity.this, Main2Activity.class);
startActivity(intent);
finish();
}
});
new Thread(){
@Override
public void run() {
for(;;){
}
}
}.start();
}
}
添加匿名线程类,子线程执行一个死循环。我们知道内部类会持有外部类的引用,所以肯定会发现内存泄漏。经过上诉步骤找到我们的Activity
XXX in Thread…说明就是我们使用匿名内部类发生了内存泄漏