分析Handler引发的内存泄漏

作者: timmy_tan | 来源:发表于2019-05-16 12:11 被阅读7次

分析工具

android studio

当前使用版本:android studio 3.4
android studio 提供了Profiler工具可以提供可视化的内存观察,以及堆转储的功能。在实际使用过程中感觉太繁琐,因为我们没法确定是哪个页面发生了内存泄漏,所以就引用了LeakCanary

2.LeakCanary

当前使用版本:com.squareup.leakcanary:leakcanary-android:1.6.3
引用官方的一句话"A memory leak detection library for Android",LeakCanary能帮我们动态监控内存泄漏,以及发生在哪个页面,同时还能自动的完成堆转储

3.MAT

当前使用版本:Eclipse Memory Analyzer Version 1.8.1
引用官方的一句话"The Eclipse Memory Analyzer is a fast and feature-rich Java heap analyzer that helps you find memory leaks and reduce memory consumption.",MAT是一个功能强大的Java堆分析器

内存泄漏代码

  • MainActivity
 @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      findViewById(R.id.btn_no_static_class).setOnClickListener(v -> startActivity(new Intent(MainActivity.this, NoStaticClassActivity.class)));
  }
  • NoStaticClassActivity
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_no_static_class);
        mHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                Log.d(TAG, Thread.currentThread().getName());
            }
        }, 1000 * 60 * 10);
        finish();
    }

分析

  • LeakCanary自动捕获到了信息:


    Screenshot_20190516-111448_LeakCanaryDemo.jpg

这个Demo比较简单,其实通过LeakCanary就可以分析出问题出现在什么地方,当内容比较复杂时LeakCanary并没有那么直观的看出内存泄漏的原因,还是需要使用MAT工具

  • MAT分析.hprof文件
    LeakCanary会自动的将泄漏信息保存到手机的\Download\leakcanary-xxxx\目录下,将该目录下的.hprof文件复制到电脑,这个文件还不能直接用MAT工具打开,需要执行下面的一段命令,转换成能正常打开的文件
hprof-conv.exe .\2019-05-16_11-13-28_699.hprof handle.hprof

将转换好的handle.hprof文件使用MAT打开就会看见下面界面


1.png

然后点击用红色圈圈起来的Histigram,会看到下面的界面


2.png
然后在红色框中输入我们要分析的类名,在LeakCanary的界面中已经很明确的知道是NoStaticClassActivity这个类发生了泄漏,所以在框中输入NoS点击回车就会列来,右键点击我们搜索出来的类名 4.png

点击后就会跳转到下面界面


3.png
这样我们就非常明确的看到了Thread持有了NoStaticClassActivity的应用,从中可以看到有MessageQueue,Message会很快想到和Handler有关,然后在分析具体代码。

解决之后的代码

  • NoStaticClassActivity
 private final Handler mHandler = new MyHandle();
 private static class MyHandle extends Handler{
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
        }
    }

在去点击按钮发现内存泄漏已经被我们修复了,本文重要的是说明工具的使用,代码有不严谨的地方请谅解

相关文章

  • 分析Handler引发的内存泄漏

    分析工具 android studio 当前使用版本:android studio 3.4android stud...

  • Android 基础

    1、Android布局 2、Android内存泄漏总结 3 、Handler内存泄漏分析及解决 4...

  • (转载自diycode)2017 Android 面试题分享整理

    Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析及解决 An...

  • java基础

    Handler怎样防止内存泄漏 handler引起内存泄漏的原因:由于handler的写法问题,如果handler...

  • android学习资料

    第一部分: Android(安卓) Android基础知识 Android内存泄漏总结 Handler内存泄漏分析...

  • Android学习之旅

    1.Android基础知识2.Android内存泄漏总结3.Handler内存泄漏分析及解决4.Android性能...

  • Handler引发的内存泄漏

    在我们写代码的时候,为了实现在子线程更新UI的需要,我们会定义一个Handler属性,并声明一个匿名内部类,重写h...

  • 常见的内存泄漏

    handler耗时引发的内存泄漏 当activity当中存在handler接收耗时的消息时,比如我们一般在网络请求...

  • 代码分析:Android中常见Handler内存泄漏

    Handler内存泄漏原因 Handler是我们常用的一个对象,在之前的文章已经分析了Handler的工作机制,然...

  • Android知识体系总结

    第一部分:Android(安卓)Android基础知识Android内存泄漏总结Handler内存泄漏分析及解决H...

网友评论

    本文标题:分析Handler引发的内存泄漏

    本文链接:https://www.haomeiwen.com/subject/brmbaqtx.html