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 的子类,详细的请一步到
4、LeakMonitor
LeakMonitor 是 native 监控的 Monitor,LoopMonitor 的子类,详细的请一步到
5、ThreadMonitor
ThreadMonitor 是 thread 监控的 Monitor,LoopMonitor 的子类,详细的请一步到