内存泄露(十)-- 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 接入

相关内容

热门资讯

《最高人民法院关于审理建设工程... 为深入贯彻习近平法治思想,认真落实党的二十届四中全会精神,正确审理建设工程施工合同纠纷案件,统一法律...
【金昌】老百姓的“声音”,是这... 编 者 按 人民,是推动经济社会发展的主角;基层,是新闻永不枯竭的源头。为深入学习和践行“四力”要求...
中国公民应立即撤离!外交部、中... 来源:“领事直通车”微信公众号 原标题:《安全提醒:驻留刚果(金)东部地区中国公民应立即撤离》 “领...
中国火箭军:假如战争今天爆发,... 11月23日,中国火箭军 @东风快递 官方账号发布高燃视频: 假如战争今天爆发,这就是我的回答! ...
河北省深入开展安责险政策宣贯活... 长城网·冀云客户端讯(记者 段永亮 何震)为全面落实国家关于安全生产责任保险工作的决策部署,深入解读...
TikTok因数据隐私问题面临... 据evrimagaci报道,以其令人欲罢不能的短视频而闻名的社交媒体巨头TikTok,如今在加拿大陷...
专家解读|推动大型网络平台个人... 大型网络平台作为个人信息处理的核心载体,其用户规模往往数以亿计,业务覆盖社交、购物、金融、娱乐等多元...
应用实践陆续展开,他们牵头开发... 在人工智能浪潮奔涌的上海徐汇,法律科技正从辅助工具演进为驱动创新的核心基础设施,为全球企业构筑安全、...
美国关税“备用方案”曝光,多名... 周末,关税领域传来一个大消息! 据外媒报道,特朗普政府正在秘密准备一套备用方案,如果美国最高法院推翻...
被起诉侵权,视觉中国公开致歉:... 南方都市报(nddaily)报道 见习记者 付冰洁 南都N视频记者 马辉 11月22日,南都N视频记...