100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > android内存泄漏MAT 利用Android Studio MAT对Android进行内存泄漏检测

android内存泄漏MAT 利用Android Studio MAT对Android进行内存泄漏检测

时间:2022-02-20 15:29:40

相关推荐

android内存泄漏MAT 利用Android Studio MAT对Android进行内存泄漏检测

利用Android Studio、MAT对Android进行内存泄漏检测

Android开发中不免会遇到各类内存泄漏,若是不及时发现处理,会致使出现内存越用越大,可能会由于内存泄漏致使出现各类奇怪的crash,甚至可能出现因内存不足而致使APP崩溃。php

内存泄漏分析工具

Android的内存泄漏分析工具经常使用有Android Studio和基于eclipse的MAT(Memory Analyzer Tool)。经过二者配合,能够发挥出奇妙的效果。Android Studio可以快速定位内存泄漏的Activity,MAT能根据已知的Activity快速找出内存泄漏的根源。java

第一步:强制GC,生成Java Heap文件

咱们都知道Java有一个很是强大的垃圾回收机制,会帮我回收无引用的对象,这些无引用的对象不在咱们内存泄漏分析的范畴,Android Studio有一个Android Monitors帮助咱们进行强制GC,获取Java Heap文件。android

强制GC:点击Initate GC(1)按钮,建议点击后等待几秒后再次点击,尝试屡次,让GC更加充分。而后点击Dump Java Heap(2)按钮,而后等到一段时间,生成有点慢。git

生成的Java Heap文件会在新建窗口打开。github

第二步:分析内存泄漏的Activity

点击Analyzer Tasks的Perform Analysis(1)按钮,而后等待几秒十几秒不等,便可找出内存泄漏的Activity(2)。正则表达式

那么咱们就能够知道内存泄漏的Activity,由于这个例子比较简单,其实在(3)就已经能够看到问题所在,若是比较复杂的问题Android Studio并不够直观,不够MAT方便,若是Android Studio没法解决咱们的问题,就建议使用MAT来分析,因此下一步咱们就生成标准的hprof文件,经过MAT来找出泄漏的根源。android-studio

第三步:转换成标准的hprof文件

刚才生成的Heap文件不是标准的Java Heap,因此MAT没法打开,咱们须要转换成标准的Java Heap文件,这个工具Android Studio就有提供,叫作Captures,右击选中的hprof,Export to standard .hprof选择保存的位置,便可生成一个标准的hprof文件。eclipse

第四步:MAT打开hprof文件

MAT的下载地址,使用方式和eclipse同样,这里就很少说了,打开刚才生成的hprof文件。点击(1)按钮打开Histogram。(2)这里是支持正则表达式,咱们直接输入Activity名称,点击enter键便可。ide

搜索到了目标的Activity函数

右击搜索出来的类名,选择Merge Shortest Paths to GC Roots的exclude all phantom/weak/soft etc. references,来到这一步,就能够看到内存泄漏的缘由,咱们就须要根据内存泄漏的信息集合咱们的代码去分析缘由。

第六步:根据内存泄漏信息和代码分析缘由

使用Handler案例分析,给出的信息是Thread和android.os.Message,这个Thread和Message配合一般是在Handler使用,结合代码,因此我猜想是Handler致使内存泄漏问题,查看代码,直接就在函数中定义了一个final的Handler用来定时任务,在Activity的onDestroy后,这个Handler还在不断地工做,致使Activity没法正常回收。

// 致使内存泄漏的代码

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

textView = (TextView) findViewById(R.id.text);

final Handler handler = new Handler();

handler.post(new Runnable() {

@Override

public void run() {

textView.setText(String.valueOf(timer++));

handler.postDelayed(this, 1000);

}

});

}

修改代码,避免内存泄漏

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_test);

textView = (TextView) findViewById(R.id.text);

handler.post(new Runnable() {

@Override

public void run() {

textView.setText(String.valueOf(timer++));

if (handler != null) {

handler.postDelayed(this, 1000);

}

}

});

}

private Handler handler = new Handler();

@Override

protected void onDestroy() {

super.onDestroy();

// 避免Handler致使内存泄漏

handler.removeCallbacksAndMessages(null);

handler = null;

}

从新测试,确保问题已经解决。

文章代码

/taoweiji/DemoAndroidMemoryLeak

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。