(4.2.39)内存泄漏检测LeakCanary源码分析

来源:互联网 发布:nosql数据库入门 pdf 编辑:程序博客网 时间:2024/06/15 13:09
  • leakcanary-watcher 实现了基本的内存检测框架,只是实现了监视机制,具体怎么监视+如何处理等都通过callback回调处理
    • RefWatcher 核心观察器,持有以下实例对象以实现内存监视机制
    • RefWatcherBuilder 构建[核心观察器],传入1-6号对象
      Set retainedKeys; //[核心]持有那些待检测以及产生内存泄露的引用的key
      ReferenceQueue queue; //[核心] 用于判断弱引用所持有的对象是否已被GC
      DebuggerControl debuggerControl; //[1.debug校验器] 用于查询是否正在调试中,调试中不会执行内存泄露检测
      GcTrigger gcTrigger; //[2.GC控制器] 用于在判断内存泄露之前,再给一次GC的机会
      HeapDumper heapDumper; //[3. 堆信息导出器] 用于在产生内存泄露室执行dump 内存heap
      WatchExecutor watchExecutor; //[4. 可延迟执行线城池] 执行内存泄露检测的线程池executor
      HeapDump.Listener heapdumpListener;//[5. 堆信息分析器] 用于分析前面产生的dump文件,找到内存泄露的原因
      ExcludedRefs excludedRefs; //[6. 白名单map]用于排除某些系统bug导致的内存泄露
  • leakcanary-analyzer 提供了基于haha的堆内存分析器HeapAnalyzer,用来对 dump 出来的内存进行分析并返回内存分析结果 AnalysisResult,内部包含了泄漏发生的路径等信息供开发者寻找定位
  • leakcanary-android: 这个 module 是与 Android 世界的接入点,用来专门监测 Activity 的泄漏情况,利用 leakcanary-watcher 来进行弱引用+手动 GC 机制进行监控
    • RefWatcherBuilderAndroid 构建android使用的[核心观察器],传入1-6号android对象
    • DisplayLeakService 后台服务[AbstractAnalysisResultService]的子类,其onHeapAnalyzed(…) 在泄漏时会被回调
    • DebuggerControlAndroid //[1.debug校验器] 用于查询是否正在调试中,调试中不会执行内存泄露检测
    • HeapDumperAndroid //[3. 堆信息导出器] 用于在产生内存泄露室执行dump 内存heap
    • package dumpfilehelp //[3.1 IO文件目录管理器] 用于创建和管理 存储heap信息的文件
    • WatchExecutorAndroid //[4. 可延迟执行线城池] 执行内存泄露检测的线程池executor
    • HeapDumpListenerAndroid //[5. 堆信息分析器] 用于分析前面产生的dump文件,找到内存泄露的原因
    • package analyzerservice //[5.1] 开启一个跨进程后台服务,并调用【leakcanary-analyzer】对堆内存信息进行分析,分析结果通过发广播方式传给另外一个后台服务
      HeapAnalyzerService 一个跨进程后台服务,并调用【leakcanary-analyzer】对堆内存信息进行分析,分析结果通过发广播方式传给另外一个后台服务
      AbstractAnalysisResultService 用于接收跨进程后台服务所传递的堆内存分析结果,触发onHeapAnalyzed(…) ps:其具体子类在[HeapDumpListenerAndroid]被实例化时构造
    • ExcludedRefsAndroid //[6. 白名单map]用于排除某些系统bug导致的内存泄露
  • ActivityWatcherManager 专注于监听Activity是否泄漏 ,内部使用了 application#registerActivityLifecycleCallbacks 方法来监听 onDestory 事件