Android 工具篇 01 --- Android Profiler内存泄漏检查

主要是三个Activity:MainActivity,ActivityOne,ActivityTwo。
MainActivity:主Activity,用于开启内存泄漏的两个Activity。
ActivityOne:通过handler方式泄漏。
ActivityTwo:通过静态引用方式泄漏。
代码如下:
MainActivity:

public class MainActivity extends AppCompatActivity {

  public static Activity activity;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      initView();
  }

  private void initView() {
      Button btnOne=findViewById(R.id.btn_one);
      btnOne.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent=new Intent(MainActivity.this,ActivityOne.class);
              startActivity(intent);
          }
      });
      Button btnTwo=findViewById(R.id.btn_two);
      btnTwo.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              Intent intent=new Intent(MainActivity.this,ActivityTwo.class);
              startActivity(intent);
          }
      });
  }

ActivityOne:

public class ActivityOne extends Activity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      new Handler().postDelayed(new Runnable() {
          @Override
          public void run() {

          }
      },1000000);
  }
}

ActivityTwo:

public class ActivityTwo extends Activity {

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      MainActivity.activity=this;
  }
}

内存泄漏分析

操作

首先我们打开MainActivity,分别开启ActivityOne和ActivityTwo并退出,回到MainActivity。接着打开Android Profiler。

检查内存泄漏对象

首先要点击左上方的“Dump Java heap”按钮。(如果是检查内存泄漏,笔者建议在点击之前先点击垃圾回收按钮,以防可回收的存货对象的混淆)
image.png

然后就会显示此刻的JAVA堆中对象以及引用情况,我们可以在Heap Dump的右上角选择对象的排列方式,笔者比较推荐按报名排序,因为一般我们检查的都是自己所写的类的泄漏,而非系统层的。

image.png

如图,我们很快就发现ActivityOne和ActivityTwo泄漏了。
笔者打开了ActivityOne和ActivityTwo之后,回到MainActivity界面并按下垃圾回收按钮。不泄露的情况应该是只有MainActivity被分配了内存,而ActivityOne和ActivityTwo均存活,说明内存没有被释放,即内存泄漏了。

Heap Dump 右边四列的意思分别如下:
Alloc Count:Java堆中的实例个数
Native Size:native层分配的内存大小。
Shallow Size:Java堆中分配实际大小
Retained Size:这个类的所有实例保留的内存总大小(并非实际大小)

继续我们在Heap Dump界面的操作,以检查ActivityOne为例,我们单击它,发现右侧出现了Instance View,然后单击Instance View的对象。

image.png

在Instance View中,会显示在ActivityOne中的各种对象,而它下方的Reference则是显示诸多对这个存货的ActivityOne对象的引用。大部分都是系统层面的引用,只有一个格外显眼,就是通过“this”对ActivityOne的引用,点进去我们可以发现是MessageQueue持有了这个引用,有点经验的Android程序员马上可以定位到是Handler的内存泄漏了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容