KOOM介绍
OOMMonitor 介绍
KOOM线上APM监控最全剖析
Koom流程:
OOM问题原因分类
koom-java-leak
模块用于 Java Heap 泄漏监控:它利用 Copy-on-write
机制 fork
子进程 dump Java Heap,解决了 dump 过程中 app 长时间冻结的问题
JVMTI
实现的内存分析器代理,其转储文件记录了Java的内存镜像(Heap Profile),其中记录了内存堆详细的使用信息,可用于分析Java程序内存的各种性能问题。dump文件也是会产生STW(Stop the world),跟GC一样会让所有线程挂起。
Koom中设置了五种检测器
① HeapOOMTracker
② ThreadOOMTracker
③ FdOOMTracker
④ PhysicalMemoryOOMTracker
⑤ FastHugeMemoryOOMTracker
前三种称为长期高内存检测器
,检测机制是当计算出内存占用率之后,我们看下面的一个判断条件,如果内存占用率超过我们设定的一个阈值(例如0.8),而且当前内存占用率跟上次比较超过了千分之5
,那么mOverThresholdCount
变量就会自增1
。
因为检测是一个循环的过程,所以当第一次进来的时候,一定会自增1,而且会将本次的内存占用率赋值给mLastHeapRatio,当下次进来的时候,如果内存占用率较上次降低了,那么就会重置。
如此往复,当mOverThresholdCount超出我们设置的阈值(例如5次)
,我们就认定系统发生了内存泄漏,这个时候就需要告警,并dump内存快照分析问题。
即 1)内存占用超过80%,2)并且检测到了5次,两个条件同时满足就会进行dump。
第四种代码中返回falsw没有进行处理。
第五种称为高危内存与快速增长检测器
,检测机制是内存占用超过90%或者本测检测与上次检测内存占用超过350M,满足两个条件之一就会进行dump。
用于监控应用的 Java 内存泄漏问题,它的核心原理:
supend->fork虚拟机进程->虚拟机resume->dump内存镜像
的策略,将传统Dump冻结进程20s的时间缩减至20ms以内Android L 及以上(API level >= 21)
支持 armeabi-v7a arm64-v8a x86 x86-64
OOMMonitor 接入
koom-native-leak
模块用于 Native Heap 泄漏监控:它利用 Tracing garbage collection
机制分析整个 Native Heap,直接输出泄漏内存信息「大小、分配堆栈等』;极大的降低了业务同学分析、解决内存泄漏的成本。
用于监控应用的 Native 内存泄漏问题,它的核心原理如下:
LeakMonitor 接入
koom-thread-leak
模块用于 Thread 泄漏监控:它会 hook 线程的生命周期函数
,周期性的上报泄漏线程信息。
用于监控应用的线程泄漏问题,它的核心原理:
ThreadLeakMonitor 接入
下一篇:设计模式-第16章(组合模式)