dumpsys meminfo内存分析解读(收集整合)

2023-11-10

OOM机制是机器底层的一种强制保鲜,在OOM发生的时候内核会排序强制杀掉进程来保证系统的继续运行,同样这种OOM异常容易发生在低内存机器上,比如512M。

首先系统会根据程序是否是空进程(已经由用户关闭的不带有任何服务和provider的进程),是否有服务,是否有provider,是否为前台进程,来排序,可以输入 adb shell dumpsys meminfo来查看,列出信息中的Total PSS by OOM adjustment:就是系统为程序的OOM排序结果,OOM异常的时候会根据这个表单从下网上杀掉进程释放内存。

部分概念

1.1 名词概念:

  • 虚拟内存
    进程空间内的虚拟内存地址,理论上32位cpu一个进程有4GB的虚拟内存可以使用。
  • 物理内存
    就是真正写的到内存条上的,真实地址对进程不可见,由操作系统把虚拟内存地址映射到物理内存地址。
  • Size
    指的就是分配了多少虚拟内存
  • mmap
    一种内存映射文件的方法。
    mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。

android程序内存被分为2部分:nativedalvik,dalvik就是java堆,普通java对象是在java堆分配,而bitmap是直接在native上分配,对于内存的限制是 native+dalvik 不能超过最大限制。Android程序内存一般限制在16M,当然也有24M的。

1.2 内存指标概念

  • VSS
    Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
    是单个进程全部可访问的地址空间
  • RSS
    Resident Set Size 实际使用物理内存(包含共享库占用的内存)
    是单个进程实际占用的内存大小,对于单个共享库, 尽管无论多少个进程使用,实际该共享库只会被装入内存一次。
  • PSS
    Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
  • USS
    Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
    USS 是一个非常非常有用的数字, 因为它揭示了运行一个特定进程的真实的内存增量大小。如果进程被终止, USS 就是实际被返还给系统的内存大小。
    USS 是针对某个进程开始有可疑内存泄露的情况,进行检测的最佳数字。怀疑某个程序有内存泄露可以查看这个值是否一直有增加。

在这里插入图片描述
内存的大小关系:VSS >= RSS >= PSS >= USS

dumpsys meminfo

PS:多个设备连接时cmd执行指令会报错:多设备连接,指定设备号也没用。

adb shell dumpsys meminfo :获取内存使用情况
结果主要包含以下4个部分:
在这里插入图片描述
adb shell dumpsys meminfo [pkg/pid] :查看指定进程或包名的内存使用情况
在这里插入图片描述

  • Uptime
    表示启动到现在的时长,不包含休眠的时间,单位毫秒(ms)

  • Realtime
    表示启动到现在的时长,包含休眠的时间,单位毫秒(ms)

  • Native Heap
    Native代码分配的内存,虚拟机和Android框架分配内存。Native代码:即非Java代码分配的内存。
    指C中malloc出来的堆空间。
    扩展:c++申请的内存为native process,java申请的内存:java process

  • Dalvik Heap
    Java对象分配的占据内存。

  • Dalvik Other
    类数据结构和索引占据内存。

  • Stack:栈内存。

  • Ashmem
    匿名共享内存(Anonymous Shared Memory-Ashmem)不以dalvik- 开头的内存区域,通过分配一个多个进程可以共享的带名称的内存块来提供共享内存。
    Android匿名共享内存是基于Linux共享内存的,它们都是在tmpfs文件系统上新建文件,并将其映射到不同的进程空间,从而达到共享内存的目的,只是,Android在Linux的基础上进行了改造,并借助Binder+fd文件描述符实现了共享内存的传递。
    参考文章:
    Android匿名共享内存(Ashmem)原理(简书——看书的小蜗牛)
    Android系统匿名共享内存Ashmem简要介绍和学习计划

  • Other dev
    内部driver占用的内存。

  • .so mmap
    C库代码占用的内存。

  • .jar mmap
    java文件代码占用的内存。

  • .apk mmap
    apk代码占用的内存。

  • .ttf mmap
    ttf字体文件代码占用的内存。

  • .dex mmap
    dex文件代码占用的内存。类函数的代码和常量占用的内存,dex mmap是映射classex.dex文件,Dalvik虚拟机从dex文件加载类信息和字符串常量等。Dex文件有索引区和Data区

  • Other mmap
    其它文件占用的内存

  • Objects
    是统计App内部组件对象个数,其中Views、ViewRootImpl以及Activities个数,在Activity onDestroy后应该都会回收清零,如果onDestroy调用后这几个对象个数没有清零,就可能发生了内存泄漏。

附:

adb shell dumpsys [options]
meminfo 内存
cpuinfo CPU
gfxinfo 帧率
display 显示
power 电源
battery 电池
batterystats 电池状态
location 位置
alarm 闹钟
account accounts
activity 显示所有的activities的信息
window 显示键盘,窗口和它们的关系
wifi 显示wifi信息

资料来源们:
android dumpsys meminfo 详解(博客园——不言不语技术)
android dumpsys meminfo 详解(CSDN——凯文的内存)
对APP进行dumpsys meminfo内存分析解读(CSDN——manok)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dumpsys meminfo内存分析解读(收集整合) 的相关文章

  • VirtualBox 上的 Android x86:Android 已连接但不在线

    我正在尝试使用 Oracle VirtualBox 配置 Android x86 运行机器 以便它可以与 Eclipse 一起使用 我在使我的虚拟机 在线 时遇到一些麻烦 我通过在 Android 终端模拟器中键入以下内容将手机连接到 ad
  • 使用 adb 向 Android 手机发出捏合/捏合命令

    到目前为止 我可以使用 adb 命令点击 滑动 解锁 安装 卸载和启动应用程序 但无法找到如何使用 adb 命令执行放大 缩小 我已经获得了捏入 捏出的坐标 但不知道如何使用终端的 adb 命令来触发它们 例如 我们有命令 gt adb s
  • 如何通过外部 adb 命令判断 Android 活动是否已完成?

    在我们的测试中 我想使用脚本来运行一些 Android 活动 我可以使用 adb shell start Activity 命令来启动这些活动 有没有办法使用 adb 命令来判断活动何时完成 在发出下一个 adb start Activit
  • 是否可以禁用应用程序而不隐藏它们?

    背景 最终用户可以通过操作系统内置的应用程序管理器禁用某些应用程序 该屏幕看起来像这样 在某些设备上它显示 关闭 一旦禁用应用程序 它就不会处于活动状态 并且不会以任何方式运行 直到您再次重新启用它 不过 为了重新启用它 您仍然可以在应用程
  • Android:通过 adb shell am 启动应用程序信息对话框

    我正在尝试编写一个脚本 它将通过 adb 为我正在测试的应用程序启动 应用程序信息 系统对话框 我做了一些调查并提出了这个命令 它将启动 应用程序信息 但会因强制关闭而失败 logcat 中的 NullPointerException ad
  • 为什么使用 Android ADB shell 的 SQLite 3 命令返回“权限被拒绝”?

    具体来说 我试图使用sqlite3使用 ADB shell 命令对我正在构建的 Android 应用程序的数据库运行一些查询 我不断收到 sqlite3 权限被拒绝 我正在从 Google 购买的 Nexus One 上进行开发 我的手机需
  • 无法使用 adb 从 Android 设备提取 APK

    我正在尝试从我的设备获取已安装应用程序的 APK 我正在按照中的说明进行操作这个答案 https stackoverflow com a 18003462 5466997但是在拉取它时 adb 说 APK 不存在 这是具体步骤 adb sh
  • 如何将Android模拟器连接回ADB?

    当我通过在 Eclipse 中点击 调试 启动模拟器后 经过一定时间后它会与 ADB 断开连接 但模拟器保持打开状态 它反应灵敏 我可以导航和启动应用程序 如何将模拟器连接回 ADB 以便能够从 Eclipse 进行调试 当前的解决方法是终
  • adb shell dumpsys meminfo - 其输出的每个单元格的含义是什么?

    我正在查看下面给出的命令的输出 adb shell dumpsys meminfo com imangi templerun 但是 我无法正确理解这一点 有人能帮我理解这一点吗 由于 dumpsys 的不同版本显示的列和行可能有所不同 我将
  • Android Studio 无法识别 LG G4

    我刚刚拿到 LG G4 手机 打开开发人员选项模式 尝试从 Android Studio 运行应用程序 但它无法识别我的手机 我什至尝试从 MTP 切换到 PTP 但仍然无法识别 我尝试了很多那里的资源 仍然一无所获 请问有人可以帮忙吗 所
  • 使用 adb 连接到 LG 手机时出现问题 (Mac OS X 10.7.5)

    当我跑步时adb devices没有设备显示为已连接 我的设备是运行 4 4 2 的 LG Optimus Exceed 2 周围有很多这样的帖子 所以这就是我所做的 我正在使用电话附带的数据线 它会充电并尝试同步照片 因此这不是问题 切换
  • 如何使用adb shell输入来输入&符号?

    adb shell input text 不起作用 也不行adb shell input keyevent KEYCODE AMPERSAND 相关问题 7789826 https stackoverflow com questions 7
  • 即使在模拟器上,“adb root”命令也会返回“adbd 无法在生产版本中以 root 身份运行”?

    我正在尝试运行adb root模拟器上的命令 这是我连接的唯一设备 adb devices List of devices attached emulator 5554 device 但是 我收到以下错误消息 adb root adbd c
  • 如何启动超过 16 个 Android 模拟器

    运行 16 个模拟器时 adb devices shows List of devices attached emulator 5584 emulator 5582 emulator 5580 emulator 5578 emulator
  • 初始化 ADB 时出错:无法创建调试桥:无法启动 ADB 服务器

    当这些问题都无法帮助我时 这意味着我需要删除并重新安装 Android Studio 这是错误 初始化 ADB 时出错 无法创建调试桥 无法启动 ADB 服务器 adb 服务器版本 36 与此客户端不匹配 杀 无法从 ADB 服务器读取 O
  • adb 可以检测的设备数量是否有上限

    我想知道 android adb 工具可以检测的设备数量是否有最大限制 我在谷歌上没有找到任何答案 我已经成功连接了 13 台设备 但我不知道它是否仍然适用于更多设备 Thanks 似乎没有 adb 限制 但有一个 USB 控制器限制 具体
  • 使用“adb devices”命令无法找到 Android 设备

    我正在开发Android申请于macOS我的应用程序在模拟器上运行良好 我想在设备上运行它 但是当我运行时adb devices我什么也没得到 localhost platform tools BF adb devices List of
  • 如何将 Pixel 2 连接到 ADB

    我有一台已解锁并启用了 USB 调试的 Pixel 2 然而 如果我将其插入计算机 它只会显示正在充电 USB 线可以连接其他设备进行数据传输 但没有问题 所以它不是线 我可以轻松地将任何其他设备连接到我的任何端口 甚至是原来的 Pixel
  • 未找到 ADB screenrecord 命令

    我无法奔跑adb shell screenrecord sdcard my mp4 我尝试运行此命令的设备规格 Honor 5C 安卓6 0 每当我运行 screenrecord 命令时 它都会显示未找到命令 D adb gt adb sh
  • 如何在 Mac 终端上运行 adb?

    adb shell run as data data com mypackagename returns 找不到 adb 命令 虽然我在目录中看到 adb Users me Library Android sdk platform tool

随机推荐

  • Pandas库常用函数和操作

    目录 1 DataFrame 处理缺失值 dropna 2 根据某维度计算重复的行 duplicated value counts 3 去重 drop duplicates 4 拼接 1 拼接列 merge 2 拼接行 5 找出在某一特定维
  • PCB Dk、Df和介质损耗

    介电常数Dk Dk即Dielectric constant的简称 中文名叫介电常数 又叫介质常数或介电系数 它是表示绝缘能力特性的一个系数 以字母 表示 在工程应用中 介电常数时常以相对介电常数的形式来表达 而不是绝对值 常见应用有计算阻抗
  • VS2010启动速度变慢和编译速度变慢的解决办法

    以前一直用VC6 0编写C 和MFC程序 速度非常快 后来因为要编64位程序 只能舍弃掉6 0 改VS2010 其实就功能来说 VC6 0真的够用了 VS2010的高级功能从来没用过 刚开始装VS2010的时候运行速度还算可以 但用了不到一
  • 跨线程的信号与槽

    跨线程的信号与槽 接着上面讨论的 我们如何应用驻足在其他线程里的QObject方法呢 Qt提供了一种非常友好而且干净的解决方案 向事件队列post一个事件 事件的处理将以调用我们所感兴趣的方法为主 当然这需要线程有一个正在运行的事件循环 而
  • 【云原生之Docker实战】使用docker部署Halo博客系统

    云原生之Docker实战 使用docker部署Halo博客系统 一 Halo介绍 1 Halo简介 2 Halo特点 3 本次实践说明 二 检查本地docker环境 1 检查docker版本 2 检查docker状态 3 检查docker
  • 面向对象设计原则——里氏代换原则

    里氏代换原则 Liskov Substitution Principle LSP 所有引用基类 父类 的地方必须能透明地使用其子类的对象 里氏代换原则告诉我们 在软件中将一个基类对象替换成它的子类对象 程序将不会产生任何错误和异常 反过来则
  • msvcp120.dll文件丢失如何解决?

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个msvcp120 dll文件进行安装 前提是找到
  • InvalidIndexError: (slice(None, None, None), None)

    在对照书复现代码时 1 直接将X Y画图不会报错 2 引入线性回归模型 再用拟合的数据画图就报错 原因 需要转换数据格式 import pandas as pd import matplotlib pyplot as plt import
  • 规避【虚拟专线技术】使用风险实现业务系统安全

    本文为作者学习文章 按作者习惯写成 如有错误或需要追加内容请留言 不喜勿喷 本文为追加文章 后期慢慢追加 一 技战法描述 VPN是利用Internet等公共网络基础设施 通过隧道加密通信技 术 为用户提供安全的数据通信的专用网络 可以实现不
  • 使用EasyPoi导入导出Excel

    easypoi功能如同名字easy 主打的功能就是容易 让一个没见接触过poi的人员 就可以方便的写出Excel导出 Excel模板导出 Excel导入 Word模板导出 通过简单的注解和模板 语言 熟悉的表达式语法 完成以前复杂的写法 这
  • idea Ctrl+Alt+T 快捷键失效、无法弹出surround with、与qq热键冲突-解决办法

    idea Ctrl Alt T 快捷键失效 无法弹出surround with 与qq热键冲突 解决办法 1 问题描述 2 解决方法1 3 解决方法2 1 问题描述 idea快捷键 CTRL ALT T 这个快捷键失效了 显然是热键冲突 其
  • Web中间件常见安全漏洞总结

    IIS IIS是Internet Information Services的缩写 意为互联网信息服务 是由微软公司提供的基于运行Microsoft Windows的互联网基本服务 IIS目前只适用于Windows系统 不适用于其他操作系统
  • Beyond Compare代码对比工具

    一个程序员的工作不仅仅是写代码 还有代码的检查 比较 版本日志等等 所以一个聪明的程序员会利用各种工具来简化这些工作 比如 代码的检查 我们会用一些ide 如写ios用xcode 写c 用vs 写android用android studio
  • PyQt5打开文件目录(QTreeView)并在QT界面输出文件目录并双击文件返回文件目录名

    最近发现了一个挺厉害的人工智能学习网站 内容通俗易懂 风趣幽默 感兴趣的可以点击此链接进行查看 床长人工智能教程 废话不多说 请看正文 打开整个文件目录 直接打开电脑的各个文件目录 显示出c盘 d盘等 如下图所示 代码如下 import s
  • win10与centos7的双系统U盘安装(一:制作u盘启动盘)

    博主近来在学习linux系统 当然学习第一步自然是安装系统了 博主选择的是centos7 博主自己的电脑是联想的 系统是win10专业版 在历经数次失败后 博主成功使用u盘安装了win10和centos的双系统 并且恢复了win10的启动项
  • 【模板】有理数取余(小白版)

    模板 有理数取余 洛谷P2613 题目链接 https www luogu com cn problem P2613 解题思路 不知道你是如何找到这个题解的 或者直接百度的 或者在我的其他题解里链接过来的 有理数取余这是一个知识点 也可能配
  • golang 两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标

    给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不能重复出现 你可以按任意顺
  • 三目运算符的多层嵌套

    三目运算符的基础用法是二选一 当我们想多选一时就可以利用三目运算符的多层嵌套来完成 可以替代if多层判断 三目运算符的结构 根据不同的条件 执行不同的操作 返回不同的值 嵌套语法 条件1 值1或操作1 如果满足条件1 就返回值1或执行操作1
  • 超级账本Fabric区块链用弹珠游戏Marbles 部署

    Marbles 演示 Marbles GitHub地址 关于 Marbles 这个应用程序的基础网络是 Hyperledger Fabric 后者是一个 Linux Foundation 项目 您可能想查阅以下操作说明来稍微了解一下 Hyp
  • dumpsys meminfo内存分析解读(收集整合)

    OOM机制是机器底层的一种强制保鲜 在OOM发生的时候内核会排序强制杀掉进程来保证系统的继续运行 同样这种OOM异常容易发生在低内存机器上 比如512M 首先系统会根据程序是否是空进程 已经由用户关闭的不带有任何服务和provider的进程