通过Android studio 3.0.1监测内存泄露

通过Android studio 3.0.1监测内存泄露

内存泄露

在java中有gc垃圾回收机制,但是由于我们在编写代码的时候,变量申请内存后,但是一直得不到回收的时候,就会产生内存泄露。

Android studio 3.0.1监测内存泄露

本文主要通过Android studio 3.0.1工具来进行内存泄露的检测。

先编写如下例子。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.text).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this,Main2Activity.class));
            }
        });
    }
}

MainActivity类,作为程序入口,通过MainActivity跳入Main2Activity,在通过Main2Activity跳入Main3Activity,

这里Main2Activity和Main3Activity代码就不给出,简单得到跳转。

public class MyApplication extends Application {
    private Main2Activity main2Activity;
    @Override
    public void onCreate() {
        super.onCreate();
        main2Activity=new Main2Activity();
    }
}

这里通过让Application强引用持有Main2Activity,模拟出一个内存泄露的例子。

依次进入Main2Activity,Main3Activity,然后回到MainActivity。

点击Android studio上的Android Profiler。

可以看到cpu,memory,network的使用情况,这里我们点击memory




进入到内存检测的画面,点击左上角的 按钮进行强制gc,再点击 进行堆栈查看。进入到如下界面



这里我们通过Arrange by package,通过包分类,查看到我们自己的类,如下所示


这里可以很清楚的看到由于MainActivity正在运行中,所以占用了内存,Main3Activity已经被销毁,但是Main2Activity由于被Application持有了其引用,并没有被回收,所以还在占用内存。
我们点击Main2Activity,进入到详细查看。

可以在Reference中看到,Main2Activity在MyApplication中存在着,由于得不到回收,所以存在着内存泄露。
定位到具体的位置,我们就可以通过代码进行修改。在这个问题中如果我们将Application中的Main2Activity改为弱应用,或者在使用完Main2Activity后将其finish掉,上面的问题就可以得到解决。


猜你喜欢

转载自blog.csdn.net/zxc641483573/article/details/78979415