内存泄露(十)-- KOOM(高性能线上内存监控方案)
创始人
2025-05-28 18:09:44
0

KOOM介绍
OOMMonitor 介绍
KOOM线上APM监控最全剖析

目录

  • KOOM 功能
    • 1. Java Heap 泄漏监控
      • 1.1 OOMMonitor 介绍
      • 1.2 OOMMonitor 适用范围
      • 1.3 OOMMonitor 接入
    • 2. Native Heap 泄漏监控
      • 2.1 LeakMonitor 介绍
      • 2.2 LeakMonitor 适用范围
      • 2.3 LeakMonitor 接入
    • 3. Thread 泄漏监控
      • 3.1 ThreadLeakMonitor 介绍
      • 3.2 ThreadLeakMonitor 适用范围
      • 3.3 ThreadLeakMonitor 接入

  KOOM(Kwai OOM, Kill OOM)是快手性能优化团队在处理移动端OOM问题的过程中沉淀出的一套完整解决方案。

KOOM 功能

Koom流程:
在这里插入图片描述
OOM问题原因分类

  1. Java堆内存溢出
  2. 无足够连续内存空间
  3. FD(文件描述符)超出限制
  4. 线程数量超出限制
  5. 虚拟内存不足

1. Java Heap 泄漏监控

  koom-java-leak 模块用于 Java Heap 泄漏监控:它利用 Copy-on-write 机制 fork 子进程 dump Java Heap,解决了 dump 过程中 app 长时间冻结的问题

  • fork子进程去执行dumpHprofData方法
  • fork进程采用的是“Copy On Write”技术,只有在进行写入操作时,才会为子进程拷贝分配独立的内存空间,默认情况下,子进程可以和父进程共享同个内存空间,所以,当我们要执行dumpHprofData方法时,可以先fork一个子进程,它拥有父进程的内存副本,然后在子进程中执行dumpHprofData方法,而父进程则可以正常继续运行。
    在这里插入图片描述
      hprof是基于JVMTI实现的内存分析器代理,其转储文件记录了Java的内存镜像(Heap Profile),其中记录了内存堆详细的使用信息,可用于分析Java程序内存的各种性能问题。
      虚拟机提供的Debug.dumpHprofData可以将hprof文件输出在指定的文件中,但是这个过程会“冻结”整个应用进程,造成数秒甚至数十秒内用户无法操作,即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。

1.1 OOMMonitor 介绍

用于监控应用的 Java 内存泄漏问题,它的核心原理:

  • 周期性查询Java堆内存、线程数、文件描述符数等资源占用情况,当连续多次超过设定阈值或突发性连续快速突破高阈值时,触发镜像采集
  • 镜像采集采用虚拟机supend->fork虚拟机进程->虚拟机resume->dump内存镜像的策略,将传统Dump冻结进程20s的时间缩减至20ms以内
  • 基于shark执行镜像解析,并针对shark做了一系列调整用于提升性能,在手机设备测即可执行离线内存泄露判定与引用链查找,生成分析报告

1.2 OOMMonitor 适用范围

  • Android L 及以上(API level >= 21)

  • 支持 armeabi-v7a arm64-v8a x86 x86-64

1.3 OOMMonitor 接入

OOMMonitor 接入

2. Native Heap 泄漏监控

  koom-native-leak 模块用于 Native Heap 泄漏监控:它利用 Tracing garbage collection 机制分析整个 Native Heap,直接输出泄漏内存信息「大小、分配堆栈等』;极大的降低了业务同学分析、解决内存泄漏的成本。

2.1 LeakMonitor 介绍

用于监控应用的 Native 内存泄漏问题,它的核心原理如下:

  • hook malloc/free 等内存分配器方法,用于记录 Native 内存分配元数据「大小、堆栈、地址等」
  • 周期性的使用 mark-and-sweep 分析整个进程 Native Heap,获取不可达的内存块信息「地址、大小」
  • 利用不可达的内存块的地址、大小等从我们记录的元数据中获取其分配堆栈,产出泄漏数据「不可达内存块地址、大小、分配堆栈等」

2.2 LeakMonitor 适用范围

  • Android N 及以上(API level >= 24)
  • 仅支持 arm64-v8a

2.3 LeakMonitor 接入

LeakMonitor 接入

3. Thread 泄漏监控

  koom-thread-leak 模块用于 Thread 泄漏监控:它会 hook 线程的生命周期函数,周期性的上报泄漏线程信息。

3.1 ThreadLeakMonitor 介绍

用于监控应用的线程泄漏问题,它的核心原理:

  • hook pthread_create/pthread_exit 等线程方法,用于记录线程的生命周期和创建堆栈,名称等信息
  • 当发现一个joinable的线程在没有detach或者join的情况下,执行了pthread_exit,则记录下泄露线程信息
  • 当线程泄露时间到达配置设置的延迟期限的时候,上报线程泄露信息

3.2 ThreadLeakMonitor 适用范围

  • Android N 及以上(API level >= 24)
  • 仅支持 arm64-v8a

3.3 ThreadLeakMonitor 接入

ThreadLeakMonitor 接入

相关内容

热门资讯

菲媒:菲律宾副总统称,不优先考... 【环球网报道】综合菲律宾《马尼拉标准报》等媒体6月1日报道,菲律宾副总统莎拉·杜特尔特称,她不优先考...
原创 美... 特朗普再次执掌白宫后,他的“地盘扩张梦”可谓是雷声大雨点小,搞得沸沸扬扬却未见实效。他本想一口气吞掉...
法网-郑钦文鏖战2-1萨姆索诺... 北京时间6月1日,2025赛季网球大满贯法国公开赛继续进行,在女单第三轮的一场比赛中,赛会8号种子、...
以国防军:黎以停火以来超180... △黎巴嫩南部地区(资料图) 以色列国防军当地时间6月1日下午发布消息称,当天上午,一名黎巴嫩真主党特...
深夜,巨子生物突发声明:接受检... 每经编辑|金冥羽 巨子生物旗下重组胶原蛋白品牌可复美产品成分争议持续发酵。 6月1日22点32分,...
新修订的《快递暂行条例》6月1... 6月1日起,《国务院关于修改〈快递暂行条例〉的决定》正式施行。此次修改,专门增加了“快递包装”章节,...
开放“以债换房”政策,可直接置... “南京网络辟谣”微信公众号6月1日发文称,近日,有“南京二手房零首付李经理”“合肥瑶珺房地产代理有限...
GCN的几种模型复现笔记 引言 本篇笔记紧接上文,主要是上一篇看写了快2w字,再去接入代码感觉有点...
基于TDesign风格的Bla... 作为一名Web开发人员,开发前端少不了使用JavaScript,而Bla...