使用Android Studio自带的Memory monitor工具检测内存泄漏

首先写个内存泄漏的例子:单例模式

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…说明就是我们使用匿名内部类发生了内存泄漏

发布了194 篇原创文章 · 获赞 42 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39027256/article/details/104252461