KOOM 源码分析

695 阅读1分钟

一、版本

基于:implementation 'com.kwai.koom:java-oom:1.0.7'

二、分析

KOOM初始化流程

   * KOOM entry point, make sure be called in the main thread!
   *
   * @param application application needed
   */
  public static void init(Application application) {
    KLog.init(new KLog.DefaultLogger());

    if (inited) {
      KLog.i(TAG, "already init!");
      return;
    }
    inited = true;

    if (koom == null) {
      koom = new KOOM(application);
    }

    koom.start();
  }
KOOMInternal.java

private Handler koomHandler;

 public void start() {
    HandlerThread koomThread = new HandlerThread("koom");
    koomThread.start();
    koomHandler = new Handler(koomThread.getLooper());
    startInKOOMThread();
  }
  
 private void startInKOOMThread() {
 //默认10秒无线循环
  koomHandler.postDelayed(this::startInternal, KConstants.Perf.START_DELAY);
 }
private void startInternal() {
  if (started) {
    KLog.i(TAG, "already started!");
    return;
  }
  started = true;

  heapDumpTrigger.setHeapDumpListener(this);
  heapAnalysisTrigger.setHeapAnalysisListener(this);

  if (KOOMEnableChecker.doCheck() != KOOMEnableChecker.Result.NORMAL) {
    KLog.e(TAG, "koom start failed, check result: " + KOOMEnableChecker.doCheck());
    return;
  }

  ReanalysisChecker reanalysisChecker = new ReanalysisChecker();
  if (reanalysisChecker.detectReanalysisFile() != null) {
    KLog.i(TAG, "detected reanalysis file");
    heapAnalysisTrigger
        .trigger(TriggerReason.analysisReason(TriggerReason.AnalysisReason.REANALYSIS));
    return;
  }

  heapDumpTrigger.startTrack();
}