美文网首页
LeakCanary的使用

LeakCanary的使用

作者: wind_sky | 来源:发表于2019-08-01 14:53 被阅读0次

    一. 简介

    LeakCanary是Square开源的一个分析内存泄漏的神器,它使用简单,功能强大,当程序出现内存泄漏时会在通知栏给出提示,


    image.png

    点击提示会进入泄漏详情页面


    image.png

    二. 使用

    1. gradle中引用依赖

    dependencies {
        debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2'
        releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2'
    }
    

    2. 在Application中设置

    MyApplication

    //Kotlin
    class MyApplication : Application() {
    
        override fun onCreate() {
            super.onCreate()
    
            setupLeakCanary()
        }
    
        fun setupLeakCanary() {
            if (LeakCanary.isInAnalyzerProcess(this)) {
                return
            }
            enableStrictMode()
            LeakCanary.install(this)
        }
    
        fun enableStrictMode() {
            StrictMode.setThreadPolicy(StrictMode.ThreadPolicy.Builder()
                    .detectAll()
                    .penaltyLog()
                    .build())
        }
    }
    

    泄漏示例:

    //Kotlin
    class TestActivity : AppCompatActivity() {
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_test)
    
            start.setOnClickListener { v -> ruun() }
        }
    
        fun ruun() {
            object: AsyncTask<Void, Void, Void>() {     //匿名内部类
                override fun doInBackground(vararg params: Void?): Void? {
                    SystemClock.sleep(20000)
                    return null
                }
            }.execute()
        }
    
    }
    

    也可以使用LeakCanary监控Fragment的泄漏情况

    public abstract class BaseFragment extends Fragment {
    
      @Override public void onDestroy() {
        super.onDestroy();
        RefWatcher refWatcher = ExampleApplication.getRefWatcher(getActivity());
        refWatcher.watch(this);
      }
    }
    

    3. 工作机制

    • RefWatcher.watch() 创建一个 KeyedWeakReference 到要被监控的对象。

    • 然后在后台线程检查引用是否被清除,如果没有,调用GC。

    • 如果引用还是未被清除,把 heap 内存 dump 到 APP 对应的文件系统中的一个 .hprof 文件中。

    • 在另外一个进程中的 HeapAnalyzerService 有一个 HeapAnalyzer 使用HAHA 解析这个文件。

    • 得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference,定位内存泄露。

    • HeapAnalyzer 计算 到 GC roots 的最短强引用路径,并确定是否是泄露。如果是的话,建立导致泄露的引用链。

    • 引用链传递到 APP 进程中的 DisplayLeakService, 并以通知的形式展示出来。

    相关文章

      网友评论

          本文标题:LeakCanary的使用

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