通过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
进入到内存检测的画面,点击左上角的
这里我们通过Arrange by package,通过包分类,查看到我们自己的类,如下所示
这里可以很清楚的看到由于MainActivity正在运行中,所以占用了内存,Main3Activity已经被销毁,但是Main2Activity由于被Application持有了其引用,并没有被回收,所以还在占用内存。
我们点击Main2Activity,进入到详细查看。
可以在Reference中看到,Main2Activity在MyApplication中存在着,由于得不到回收,所以存在着内存泄露。
定位到具体的位置,我们就可以通过代码进行修改。在这个问题中如果我们将Application中的Main2Activity改为弱应用,或者在使用完Main2Activity后将其finish掉,上面的问题就可以得到解决。