KOOM 源码解读 - 开篇

4,030 阅读2分钟

1、KOOM 源码的目录结构

  • koom-common : 公共库,主要包括 kwai-android-base(基本的工具类,常见的调用函数等)、kwai-unwind(栈回溯相关的工具类)、third-party(分别是 shark(用于分析内存快照hprof) 和 xhook(用于 hook));
  • koom-demo : 提供的测试程序,有 java、native 和 thread 三个测试页面;
  • koom-fast-dump : 用于 hprof 文件的 dump;
  • koom-java-leak : java 内存监控;
  • koom-native-leak : native 内存监控;
  • koom-thread-leak : thread 监控;
  • koom-monitor-base : monitor 业务的架构,包括配置项、监控实现等;

2、整体架构

1、Monitor

所有 Monitor 的基类,里面有俩成员 _commonConfig 和 _monitorConfig,

  • _commonConfig : CommonConfig,公共的配置类;
  • _monitorConfig : 这个是一个泛型,不同的 Monitor 有不同的 Config 配置类;

2、LoopMonitor

LoopMonitor 是 Monitor 的子类,主要的逻辑实现

 // 不断的循环执行
 private val mLoopRunnable = object : Runnable {
    override fun run() {
      // call() 方法为 Monitor 中的抽象方法,交给子类去执行
      // 这里会由 LoopMonitor 的子类去实现各自的逻辑
      if (call() == LoopState.Terminate) {
        return
      }

      if (mIsLoopStopped) {
        return
      }

      getLoopHandler().removeCallbacks(this)
      // 再次发送延时消息,重新执行
      // getLoopInterval() 方法获取子类配置的时间,没有则取默认 DEFAULT_LOOP_INTERVAL
      getLoopHandler().postDelayed(this, getLoopInterval())
    }
  }

  // 开启循环监控
  open fun startLoop(
      clearQueue: Boolean = true,
      postAtFront: Boolean = false,
      delayMillis: Long = 0L
  ) {
    if (clearQueue) getLoopHandler().removeCallbacks(mLoopRunnable)

    if (postAtFront) {
      getLoopHandler().postAtFrontOfQueue(mLoopRunnable)
    } else {
      getLoopHandler().postDelayed(mLoopRunnable, delayMillis)
    }

    mIsLoopStopped = false
  }

  // 停止监控
  open fun stopLoop() {
    mIsLoopStopped = true

    getLoopHandler().removeCallbacks(mLoopRunnable)
  }

  protected open fun getLoopInterval(): Long {
    return DEFAULT_LOOP_INTERVAL
  }

  protected open fun getLoopHandler(): Handler {
    return commonConfig.loopHandlerInvoker()
  }

这里通过 startLoop 方法,实现每个一个时间就会执行一次 call() 方法,call() 方法由 LoopMonitor 的子类实现;

3、OOMMonitor

OOMMonitor 是 java 监控的 Monitor,LoopMonitor 的子类,详细的请一步到

KOOM 源码解读 - java 监控

4、LeakMonitor

LeakMonitor 是 native 监控的 Monitor,LoopMonitor 的子类,详细的请一步到

KOOM 源码解读 - native 监控

5、ThreadMonitor

ThreadMonitor 是 thread 监控的 Monitor,LoopMonitor 的子类,详细的请一步到

KOOM 源码解读 - thread 监控