一、版本
基于: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();
}