Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • tutorial
  • jetpack

  • components

  • androidx

  • 动态化
  • apm

    • apm相关概念
      • Runtime getMemory 与 ActivityManager.MemoryInfo
      • meminfo
        • 各个字段的含义
        • 内存区域解释
      • VSS/RSS/PSS/USS
      • tool
    • Android稳定性治理
    • Android低端机性能优化
    • monkey测试
    • bitmap
    • 大对象监控
    • android内存
    • 移动端的网络优化
    • 记一次anr问题查询ThreadedRenderer
    • 记一次shrink代码减包调研方案
    • proguard
    • R8
    • perfetto
    • mat
  • module

  • harmony

  • tool

  • other

  • kotlin

  • 《android》
  • apm
Jacky
2023-08-31
目录

apm相关概念

APM(Application Performance Management),是对应用的性能、可靠性进行线上的监控和预警的一种机制

# Runtime getMemory 与 ActivityManager.MemoryInfo

在 Android 中, 你可以使用不同的 API 来获取设备的内存信息, 其中包括 Runtime 类的 getRuntime()方法和 ActivityManager.MemoryInfo 类。它们各自用于不同的内存信息获取目的, 以下是它们之间的区别:

  1. Runtime.getFreeMemory()、Runtime.totalMemory() 和 Runtime.maxMemory():
  • Runtime 是 Java 标准库的一部分, 而不是 Android 特定的 API。它提供了一种在 Java 虚拟机中获取内存信息的方式

  • Runtime.getRuntime().freeMemory() 返回当前可用的内存大小, 它表示 Java 虚拟机中当前空闲的内存

  • Runtime.getRuntime().totalMemory() 返回 Java 虚拟机当前已分配的总内存大小

  • Runtime.getRuntime().maxMemory() 返回 Java 虚拟机试图使用的最大内存大小

这些方法主要用于监测应用在 Java 虚拟机中的内存使用情况, 而不是整个设备的内存信息。在 Android 中, 通常更推荐使用 Android 特定的内存管理 API 来获取设备内存信息

  1. ActivityManager.MemoryInfo:
  • ActivityManager.MemoryInfo 是 Android 的 API, 它提供了关于设备内存的详细信息
  • 通过创建 ActivityManager.MemoryInfo 的实例, 并使用 ActivityManager 的 getMemoryInfo()方法, 你可以获取包括总内存、可用内存、低内存阈值等在内的更多内存信息
  • 这些信息有助于你监测设备上的内存使用情况, 以便更好地管理应用程序的资源, 并在必要时采取措施来释放内存

总的来说, Runtime 类的方法主要用于监测 Java 虚拟机内存, 而 ActivityManager.MemoryInfo 用于监测设备上的系统内存。如果你关心应用程序在设备上的内存使用情况, 通常更建议使用 ActivityManager.MemoryInfo 来获取内存信息, 因为它提供了更多关于设备内存状态的详细信息, 有助于更好地优化你的应用程序

# meminfo

在 Android 中,可以使用 adb shell dumpsys meminfo 命令来查看应用的内存使用情况。这些信息包括多个指标,如 PSS(Proportional Set Size)、私有脏页面、私有干净页面、交换 PSS(SwapPSS)等。让我们解析一下这些指标,并解释它们在内存分析中的意义

# 各个字段的含义

  1. Pss Total:
  • PSS(Proportional Set Size): 反映进程使用的物理内存大小。这是内存的真实使用情况,按比例分配共享内存的部分。比如,如果有两个进程共享 1MB 的内存,每个进程的 PSS 会增加 512KB
  1. Private Dirty:
  • 私有脏页面: 进程独占且已被修改的内存页面。这些页面不能被交换到磁盘(对交换内存的情况来说),并且不能被其他进程共享
  1. Private Clean:
  • 私有干净页面: 进程独占但未被修改的内存页面。这些页面可以被交换到磁盘以释放内存,或者当它们不再需要时,可以简单地丢弃并从原始资源重新读取
  1. SwapPss:

理解 SwapPss 的概念涉及对内存管理和交换(swap)机制的理解。在操作系统中,内存(RAM)是有限的资源,而交换空间(swap space)是一种辅助内存管理的机制,当物理内存不足时,系统会将一部分内存页面写到磁盘的交换空间中,从而释放物理内存

  • 交换 PSS: 表示已经被交换到磁盘的内存量。类似于 PSS,但它特指已经被写到交换空间(swap)的内存
  1. Heap Size:
  • 堆大小: 进程当前分配的堆内存总大小
  1. Heap Alloc:
  • 堆分配: 已经被进程使用的堆内存量
  1. Heap Free:
  • 堆空闲: 堆内存中未被使用的部分

# 内存区域解释

  1. Native Heap:
  • 原生堆,指的是使用 C/C++ 分配的内存。这部分内存通常由应用的本地代码(如通过 JNI 调用的本地库)分配和管理
  1. Dalvik Heap:
  • Dalvik 堆,指的是应用的 Java 堆内存。这部分内存用于存储 Java 对象,在 ART(Android Runtime)中实际运行
  1. Stack:
  • 栈内存,每个线程有自己的栈,用于存储线程的局部变量、方法调用信息等
  1. Ashmem:
  • Android 共享内存(Anonymous Shared Memory),用于进程间通信(IPC)的一种共享内存机制
  1. Gfx dev:
  • 图形设备内存,指的是 GPU 使用的内存,用于存储图形缓冲区等
  1. Other dev:
  • 其他设备内存,指的是系统中其他设备使用的内存
  1. .so mmap:
  • 映射的共享对象(Shared Object),指的是通过内存映射(mmap)加载的本地库(.so 文件)
  1. .apk mmap:
  • 映射的 APK 文件,指的是通过内存映射加载的 APK 文件内容
  1. .ttf mmap:
  • 映射的字体文件(TrueType Font),指的是通过内存映射加载的字体文件
  1. .dex mmap:
  • 映射的 DEX 文件,指的是通过内存映射加载的 Dalvik 字节码文件(.dex 文件)
  1. .oat mmap:
  • 映射的 OAT 文件,指的是通过内存映射加载的编译后的 ART 字节码文件(.oat 文件)
  1. .art mmap:
  • 映射的 ART 文件,指的是通过内存映射加载的 ART 运行时使用的文件
  1. Other mmap:
  • 其他内存映射,指的是通过内存映射加载的其他文件
  1. EGL mtrack:
  • EGL 内存跟踪,指的是与 EGL(嵌入式图形库)相关的内存
  1. GL mtrack:
  • OpenGL 内存跟踪,指的是与 OpenGL 相关的内存
  1. Unknown:
  • 未知内存,指的是无法分类的内存
  1. TOTAL:
  • 总内存,指的是上述所有内存区域的总和

# VSS/RSS/PSS/USS

VSS(Virtual Set Size) 是操作系统中表示进程 虚拟内存 使用情况的一个指标。它包括进程的所有内存区域的总和,包括代码段、数据段、共享库、堆栈、以及内存映射文件和共享内存区域

VSS 的特点
  • VSS 包含了所有进程所能访问的虚拟地址空间,包括物理内存和交换分区中可能存在的所有内容
  • 它不是一个真实的物理内存使用量的指标,因为它包含了:
    • 共享内存:多个进程共享的内存块会被多次计入 VSS
    • 未实际使用的地址空间:即使进程仅分配了地址空间而未实际使用内存页,VSS 也会将其计入总量
  • VSS 通常会显得很大,特别是对于加载了大量动态库的程序,因为这些库的虚拟地址空间也会被计入
VSS 的计算方法

假设一个进程使用了以下几种内存:

  • 程序的可执行文件(如 .text 段)
  • 数据段(.data 和 .bss 段)
  • 动态链接库
  • 堆(malloc 等动态分配的内存)
  • 栈(函数调用、局部变量等)
  • 内存映射文件(mmap)

VSS 将这些内存区域全部加在一起,得到的就是虚拟内存大小

VSS 与其他内存指标的区别
指标 含义 特点
VSS 进程的总虚拟内存,包括所有共享库和未使用的地址空间。 不表示真实物理内存使用情况,通常较大。
RSS 进程实际占用的物理内存,即已经被映射到物理内存中的部分。 更准确地反映进程对物理内存的消耗。
PSS 对共享内存按比例分摊后的物理内存使用量。 用于衡量进程对物理内存的实际使用情况,比较合理的内存使用指标。
USS 进程独占使用的物理内存,不包括共享的部分。 用于衡量进程独占的内存开销。
例子:如何查看 VSS

在 Linux 系统中,你可以使用 ps 命令来查看 VSS 的大小:ps -eo pid,vsz,rss,comm | grep <进程名>

输出示例:

  PID    VSZ   RSS COMMAND
12345 204800 15240 my_process
1
2
  • VSZ(VSS):虚拟内存大小,单位为 KB
  • RSS:实际物理内存占用,单位为 KB
总结
  • VSS 是进程所分配的虚拟内存的总和,但并不意味着进程实际使用了那么多物理内存
  • 它可以用来大致了解进程的内存需求,但并不能直接反映物理内存的消耗情况
  • 在分析内存占用问题时,RSS、PSS 和 USS 通常比 VSS 更有实际意义

# tool

  • perfetto
  • hprof 分析工具
    • MAT(memory analyzer tool)
  • android studio
    • profile (opens new window)
#APM#Android
上次更新: 2025/10/09, 23:53:03
动态化
Android稳定性治理

← 动态化 Android稳定性治理→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式