Android性能优化—内存泄漏分析之DDMS和MAT(二)

2020-02-29  本文已影响0人  aositeluoke

  之前,我们一直都在使用Android Device Monitor对我们的应用进行各种分析,也建立了很深厚的感情,而如今,Android Device Monitor 已在 Android Studio 3.1 中弃用,并已从 Android Studio 3.2 中移除,也意味着它即将要退役,离我们越来越远了,为了纪念这位曾经对App做出巨大贡献的应用,让我们回顾一下它的事迹!

准备工作

Android Device Monitor

打开后它的主页面如图一,如果有些窗格没有展示出来,可以点击window-Reset Perspective-Yes重置下配置,或者点击window-Show View选择自己想要展示的窗格


图一.png
Devices

  设备列表如图二所示,选择某应用后,红色框内的图标就会点亮,供您使用,他们的具体信息从左到右介绍如下:

Dump HPROF file

  此功能主要用来生成.hprof文件,对于该文件的分析,还需要工具Eclipse Memory Analyzer打开才行。monitor生成的.hprof文件并不是标准的、MAT可识别的文件,因此,需要我们把.hprof转成标准的文件后,才能使用MAT工具进行分析,转换步骤如下:

public class MainActivity extends AppCompatActivity {
    private static final String TAG = MainActivity.class.getName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void onSingleInstance(View view) {
        Intent intent = new Intent(this, SingleInstanceActivity.class);
        startActivity(intent);
    }
}

SingleInstance.java

public class SingleInstance {
    private static Context context;
    private static SingleInstance singleInstance;
    private SingleInstance() {
   }
    public static SingleInstance getInstance(Context ctx) {
        if (singleInstance == null) {
            context = ctx;
            singleInstance = new SingleInstance();
        }
        return singleInstance;
    }
}

SingleInstanceActivity.java

public class SingleInstanceActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_single_instance);
        SingleInstance.getInstance(this);
    }
}

  运行App后,先点击Dump HPROF file一次获取没有产生内存泄漏的unml.hprof文件,接着依序打开SingleInstanceActivity-点击返回键,在DDMS中频繁点击GC,再继续获取有内存溢出的ml.hprof文件,然后将unml.hprof转换成unml_stantard.hprof文件,将ml.hprof转换成ml_stantard.hprof文件。

MAT

  使用MAT打开我们刚才生成的unml_stantard.hprof文件,打开步骤:File->Open Heap Demp,打开后默认展示如图三所示,这个时候我们点击Histogram如图四所示,然后在红框这个地方输入我们的包名敲回车如图五所示,红框这个地方显示,只存在一个实例,也就是MainActivity,同样的操作,我们在ml_stantard.hprof看一下,ml_stantard的Histogram如图六所示,这个时候我们发现SingleInstanceActivity还存在呢,内存泄漏也就产生了,无论我们GC多少次,由于该对象被单例对象持有,而单例对象生命周期和应用一致,所以导致SingleInstanceActivity不能回收。


图三.png
图四.png
图五.png
图六.png

最后,我们简单总结一下整个操作流程如下:

上一篇下一篇

猜你喜欢

热点阅读