指标 | 说明 |
OOM次数 | 筛选条件下发生OOM的次数(PV) |
OOM率 | 筛选条件下的OOM次数/筛选条件下的总launch次数 |
影响用户数 | 筛选条件下OOM问题影响的用户数(UV) |
影响用户比例 | 筛选条件下发生OOM错误的去重UV数/筛选条件下的去重总UV数 |
上报字段 | 指标名称 |
app_memory_rate | APP占用内存比例 |
app_memory | APP占用内存大小 |
上报字段 | 指标名称 | 获取方式 |
total_pss_background | 物理内存(后台) | Debug.MemoryInfo.getTotalPss() |
total_pss_foreground | 物理内存(前台) | Debug.MemoryInfo.getTotalPss() |
java_heap_background | Java使用内存(后台) | Runtime. getRuntime ().totalMemory()-Runtime. getRuntime ().freeMemory() |
java_heap_foreground | Java使用内存(前台) | Runtime. getRuntime ().totalMemory()-Runtime. getRuntime ().freeMemory() |
graphics_background | 显存(后台) | Debug.MemoryInfo.getMemoryStat("summary.graphics") |
graphics_foreground | 显存(前台) | Debug.MemoryInfo.getMemoryStat("summary.graphics") |
vm_size_background | 虚拟内存(后台) | /proc/进程pid/status |
vm_size_foreground | 虚拟内存(前台) | /proc/进程pid/status |
java_heap_background_used_rate | Java内存使用率(后台) | java_heap_background/Runtime. getRuntime ().maxMemory() |
java_heap_foreground_used_rate | Java内存使用率(前台) | java_heap_foreground/Runtime. getRuntime ().maxMemory() |
dalvik_pss_background | Java物理内存使用(后台) | Debug.MemoryInfo.dalvikPss |
dalvik_pss_foreground | Java物理内存使用(前台) | Debug.MemoryInfo.dalvikPss |
native_pss_background | Native物理内存使用(后台) | Debug.MemoryInfo.nativePss |
native_pss_foreground | Native物理内存使用(前台) | Debug.MemoryInfo.nativePss |
参数 | 说明 |
类名 | 标识内存节点类型名称。
选择不同聚合方式,数量、SHALLOW SIZE、RETAIN SIZE这些列数据都会发生变化。同时,区域②实例列表的显示信息也会发生变化。 |
数量 | 此种类型的节点数量。 |
SHALLOW SIZE | 此种类型节点的所有实例占用内存之和。 |
RETAIN SIZE | 此种类型节点的所有实例,及其所支配的节点,占用内存之和(支配定义可以查看附录)。 |
参数 | 说明 |
类名 | 当前节点的类名,以类名+大小的形式展示。 |
节点类型 | 节点所属的类型。 OC/Swift/Vitrual C\+\+对象通过符号化可以得到有意义的信息。 |
Ptr | 节点的地址。 |
VMType | 虚拟内存类型,Heap或者具体的VM类型。 |
VMSize | 内存大小,对于不同类型的节点,该数据有不同的口径。
|
RetainedSize | 节点支配的所有节点的内存大小之和。 |
是否为Abandoned问题 | 当前节点是否为Abandoned Memory(如果不了解Abandoned定义,可以参考附录)。 |
是否为泄漏 | 当前节点是否为内存泄漏的节点。 |
VM类型 | 说明 |
VM: Stack | 栈内存,每个线程会有自己的线程栈以及TLS等数据,这些数据就保存在VM: Stack中,这个节点的孩子就是栈引用的临时变量以及TLS等数据,包括AutoreleasePool的入口也在此,可以根据大小判断该线程的类型,通常主线程为1008KB,GCD线程以及默认的线程为544KB,其他大小自行按业务映射。例如,TTPlayer的线程某些为160KB。 |
VM: ImageIO | ImageIO使用到的数据,通常是图片,使用imageNamed/imageWithData等方法常见此类型数据。 |
VM: CG Raster Data | CoreGraphics使用到的栅格数据,通常是图片,比如SDWebImage等常用框架都会使用CoreGraphics对图片进行绘制。在重度使用网络图片的App中,该类型VM通常是内存使用的主要类型。 |
WebKit Malloc | WebKit的堆内存,WebKit使用自己的bmalloc对内存进行管理而不使用libmalloc,跨端方案(小游戏、小程序、RN、Weex)和H5会大量使用该类型内存。 |
VM: IOSurface | 跨进程、CPU与GPU共享数据的关键结构,通常是纹理、framebuffers、图片,常见于特效渲染、视频录制。 |
VM: IOKit | iOS驱动相关的内存分配,常见于纹理(比如Metal的一些纹理分配)存储等场景,和IOSurface一样,在特效渲染、视频录制等情况下会大量出现。 |
VM: LayerKit | CoreAnimation的内存使用,常见于Layer的BackingStore,如果图层过多,该类型内存会过高。 |
VM: SQLite Page Cache | SQLite分配的Page Cache。 |
VM: Type 0 | 多种可能,直接使用VM Alloc申请的即是该类型内存,Data段内存也属于该类内存。 |
参数 | 说明 |
Indirect Relation | 非直接引用,当勾选收起Heap父节点后,会出现此类节点。 |
Weak Ref | 弱引用。 |
Strong Ref | 强引用。 |
Unknown/Assign | 未知引用关系或assign。 |
术语 | 说明 |
Abandoned和泄漏 | 苹果官方文档介绍了iOS APP的内存分类:
APMPlus MemoryGraph采用类似GC的泄漏判定方法,如果从根节点出发无法到达节点A,则节点A泄漏,如果一个集合中的节点自己组成了一个独立的图,而且不与主图连通,则该集合为Abandoned。泄漏的判定不参考强弱引用关系,只参考可达性。 |
数据口径 | MemoryGraph记录了APP的所有内存状态和关系:
|