Linux嵌入式开发之内存占用

2023-05-16

一、引言

内存是嵌入式系统中的关键资源,内存占用主要是指软件系统的内存使用情况。

本篇博客将介绍如何分析内存使用以便进行进一步优化内存占用相关的基础概念和相关工具。

二、内存占用

内存占用是应用程序运行时内存的使用或引用数量。

对于开发者而言,可以使用的内存量决定了程序使用的复杂性。较大的应用程序需要更多的内存来存储数据和源代码,例如微软软件Microsoft office比之于Hello World应用程序必须使用更多的内存。由于硬件成本的考虑,嵌入式系统的内存资源远远少于PC环境。因此,在嵌入式环境中,压缩内存占用尤其关键。

减少内存占用,主要有两个好处:降低成本和提高性能。对于软件系统来说,内存占用越小,内存开销越小。DRAM在嵌入式系统中,是值得关注的资源。因此,减少内存占用就等于降低了硬件系统的成本。另一方面,应用程序内存占用小,通常意味着系统性能更好,因为应用程序内存小,较小的内存回收行为可以减少时间消耗。同时,由于缓存的文件更多而避免了较慢的IO物理操作,从而使IO的性能得到提高。

内存占用主要来自程序本身和程序本身运行环境的框架。通过手动的算法设计流程及数据结构大小,可以快速评估性能瓶颈。另一方面,由于框架本身的复杂性和动态性,框架本身引入的内存占用相对于更复杂,例如Java虚拟机(JVM)。然而,应用开发者可以通过精细的内存管理和简洁的算法设计来控制内存占用的增加。

三、内存占用分析

1、相关术语

VSS(virtual set size):虚拟耗用内存。

在进程真正使用或引用前,所以的数据和代码应该被映射到虚拟地址空间(然后才能被加载进入内存),因为现在的操作系统采用了按需的分页机制,VSS通常比真实的内存使用要大。所以,VSS只是作为进程最大可能内存占用的参考值。

图 - VSS

RSS(residential set size):实际使用物理内存。

它包含共享库所占用的内存,因为它仅仅表示该进程所使用的共享库的大小,他不管有多少进程使用该共享库,该共享库仅被加载到内存一次。所以RSS并不能准确表示单个进程的内存占用情况。

图 - RSS

PSS(proportional set size):比例分配共享库占用的内存。

实际使用的物理内存(比例分配共享库占用的内存,按照进程数等比例划分)。例如,如果有3个进程都使用了一个共享库,共占有30页内存。那么PSS将认为每个进程分别占用该进程库10页的大小。PSS是一个非常有用的数据,因为系统中所有进程的PSS都相加的话,就刚好反映系统中总共占用的内存。

图 - PSS

USS(unique set size):进程独自占用的物理内存大小。

进程独自占用的物理内存(不包含共享库占用的内存)。USS是一个非常有用的数据,因为它反映了运行一个特定的进程真实的边际成本(增量成本)。当一个进程被销毁,USS是真实返回给系统的内存。当进程中存在一个可疑的内存泄漏时,USS是最佳观察数据。其中heap和stack大小是独有内存最好的例子。应用程序本身可以通过算法及压缩数据结构等来减少此类内存占用。

图 - USS

2、分析工具

2.1、/proc/meminfo

/proc/meminfo反映当前平台的内存使用情况。

memtotal:linux系统启动后的所有可用内存。

memfree:当前空闲内存总大小。

buffer:用来给文件做缓冲大小的size。它将在应用程序执行IO操作时创建,io操作完进行回收。

cached:被高速缓冲存储器使用的内存大小。为了加速IO性能,linux内核通常使用空闲内存来缓存文件内容。这里的文件内容既包括可执行代码也包括rw数据。当空闲内存较低时,内核会释放一些非活跃状态的cache从而获得更多的空闲内存。

active:在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非必要否则不会被移作他用。

inactive:在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。

swap total/swap free:因为在android l之后,zram特性默认会被启用,交换区域通常被用来压缩内存以节省出空闲内存空间。

图 - /proc/meminfo

2.2、procrank

Procrank显示所有用户进程的内存占用快照,如下图所示。输出结构默认按照RSS排序,因此,方便比较应用程序占用空间。

图 - procrank

2.3、procmem

与Procrank不同,Procmem提供所选进程内存的详细信息分配。

典型应用场景如下:首先,使用procrank找出内存占用瓶颈进程,然后使用procmem分析这个进程从而找到可以优化的方向,比如使用了最大的共享库或缓冲区。

此工具还可以帮助定位内存泄漏。在有可能发生内存泄漏的两次较长间隔内,使用该工具,通过比较procmem的输出结果,查找缓冲区增长较大的缓冲区内存。该技术有助于快速缩小筛选范围。

Procmem其他区域描述如下:

ShCI(干净共享内存):纯共享内存大小;

ShDi(脏共享内存):脏共享内存大小;

PrCi(干净私有内存):纯私有内存大小;

PrDi(脏私有内存):脏私有内存大小;

Name:映射到内存空间的名字。

图 - procmem

2.4、ps

Procmem和procrank只适用于eng版本。Ps版本是在user版本上显示占用信息的唯一工具。如下图所示,ps输出如下,单位为Kbytes。

PID:进程ID;

PPID:父进程ID;

VSIZE:虚拟地址间隔;

RSS:如前所述,物理内存的实际使用情况。

具体ps命令的使用方式,可以查看这个作者的博客——书香水墨。

图 - ps

2.5、dumpsys meminfo

此命令用于观察当前应用程序如何分配给不同类型的RAM。

图 - dumpsys meminfo

native heap:native heap分配的内存,虚拟机和Android框架分配内存。native代码,即非Java分配的内存。

dalvik heap:Java对象分配的占据内存。

dalvik other:类数据结构和索引占据内存。

other dev:内部驱动程序占用的内存。

GL memtrack:GL纹理大小、GL缓冲命令和固定驱动RAM开销。

unknown:PSS的内存区域的值大小。

private(clean and dirty)RAM:它指的是仅仅与当前进程所使用的内存大小,是当前进程销毁后可以回收后的RAM大小。一般来说,最重要的是“private dirty”RAM,因为它只被当前进程使用。所有的被dalvik和native堆分配器分配的RAM都是private dirty ram。和Zygone进程共享的dalvik和native分配的ram是shared dirty ram。

 

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

Linux嵌入式开发之内存占用 的相关文章

  • ROS自定义发布消息类型

    ROS自定义发布消息类型 xff1a 在 ROS 通信协议中 xff0c 数据载体是一个较为重要组成部分 xff0c 在上一案例中 xff0c ROS 中通过 std msgs 封装了一些原生的数据类型 比如 String Int32 In
  • ROS服务通信:自定义数据文件以及服务端和客户端代码编写流程及步骤详解

    ROS服务通信具体实现流程 demo xff1a 实现两个整型数相加求和 xff0c 客户端发送两个整型数 xff0c 服务端对其求和 服务通信也需要自定义服务数据类型 xff0c 即自定义srv文件 xff0c 该过程和自定义msg文件非
  • ROS TF静态坐标变换实现

    ROS TF静态坐标变换实现 法一 xff1a 编码实现 发布方代码实现 xff1a 创建功能包并添加依赖 catkin create pkg tf static roscpp rospy std msgs tf2 tf2 ros tf2
  • ROS:Gazebo导入自定义环境

    Gazebo导入自定义环境 之前的案例gazebo中导入的是一个空世界empty world xff0c 这里会介绍如何导入房屋数目等自定义的环境 xff08 1 xff09 启动 gazebo 打开构建面板 xff0c 绘制仿真环境 xf
  • ROS导航实现:SLAM建图(slam_gmapping)与保存(map_server)

    导航实现 xff1a SLAM建图 先安装相关的ROS功能包 安装 gmapping 包 用于构建地图 sudo apt install ros lt ROS版本 gt gmapping 安装地图服务包 用于保存与读取地图 sudo apt
  • ROS导航实现:amcl定位

    ROS导航实现 xff1a amcl定位 xff08 1 xff09 首先编写启动amcl的launch文件 xff0c 这里建议复制粘贴模板 xff0c 再修改相关的参数即可 xff0c 步骤如下 xff1a 主目录下进入amcl文件 r
  • ROS导航实现之路径规划

    导航实现之路径规划 move base 功能包提供了基于动作 action 的路径规划实现 xff0c move base 可以根据给定的目标点 xff0c 控制机器人底盘运动至目标位置 xff0c 并且在运动过程中会连续反馈机器人自身的姿
  • 创建个人网站(github pages)并将站点一键托管到Github

    创建个人网站 xff08 github pages xff09 并将站点一键托管到Github 内容 xff1a 使用网站生成器mkdocs将markdown文件生成wiki站点并挂载到github的流程总结 亮点 xff1a 个人网站一键
  • 视觉SLAM十四讲(第2版)总结

    最近看完了 视觉SLAM十四讲 xff08 第2版 xff09 xff1a 从理论到实践 xff08 高翔等著 xff09 xff0c 原书分两部分 xff0c 先介绍了数学基础 xff0c 然后介绍了具体的SLAM实践 xff0c 非常适
  • 我的公众号 - 豆芽儿 软件研发人才生长社区

    为你系统分享敏捷开发 项目管理 需求分析 软件设计 UML 中层领导力 CMMI IT职场 ACP 软考 PMP等 高大上 的实用知识 xff0c 帮助你进阶为高端人才 xff01
  • Openblas 下载和使用方法

    Openblas 下载及使用 环境 xff1a 平台 xff1a Ubuntu 20 04 xff0c Orin xff1a Arm Cortex A78AE v8 2 64 bit 步骤 xff1a 1 去github 下载openbla
  • FreeRTOS学习记录

    FreeRTOS学习记录 前言FreeRTOS学习记录在STM32CubeMX中配置FreeRTOS 前言 本人小白 xff0c 最近学习了FreeRTOS操作系统 xff0c 打算做一点记录 学习的过程中虽然做了点练习 xff0c 不过都
  • 如何给华三交换机恢复出厂设置及命令

    如何给华三交换机恢复出厂设置及命令 在前几天 xff0c 上级单位线路重新规划 xff0c 需要我们将单位的线路进行改造 xff0c 这就涉及到了网络设备的重新配置 经查看 xff0c 上级接入交换机的业务端口配置为access xff0c
  • 解决Linux下Docker下载安装太慢

    卸载先前版本 yum remove docker docker span class token operator span client docker span class token operator span client span
  • sqlyong连接docker中的mysql 失败can‘t connect to MySQL server on (*******:3306)

    解决sqlyong连接docker中myslq失败 xff1a 一 查看mysql是否运行docker ps 二 查看mysql端口映射是否与连接相符 三 进入mysql容器查看是否能够进行本地连接docker exec it mysql
  • 解决springboot+webSocket出现404错误

    这是因为websocket创建的bean是由自己来管理的 需要将其创建的bean交给spring管理 创建websocketconfig span class token keyword package span com span clas
  • Bytebuffer源码剖析及实现原理

    Bytebuffer 官方解释A byte buffer xff0c 一个字节缓冲区 一 使用方法 ByteBuffer 初始状态是写模式 使用IO流即可写入数据 如 channel read 如果需要读取ByteBuffer中的数据调用f
  • Linux下安装并配置FTP文件服务器

    一 安装vsftpd 1 运行如下代码安装vsftpd yum install span class token operator span y vsftpd 2 运行以下命令设置FTP服务开机自启动 systemctl enable vs
  • Java 实现 图片OCR文字识别

    Java 实现图片OCR文字识别功能 前言 由于网上很多算法 以及语言库无法做到精准识别 所以综合条件下 使用了一款 space OCR API 的产品进行使用 每个月有25000条的 使用额度 日常使用或开发绰绰有余 网址链接 一 注册
  • js实现表单的校验

    js实现表单校验 CV即用 1 效果图 当每个输入框失去焦点时会通过正则表达式来验证输入的格式是否正确 点击登录按钮后 xff0c 如果有格式不正确的将无法登录 当校验全部通过以后才可以登录 2 源代码 xff1a HTML代码 xff1a

随机推荐

  • 你和国际项目经理(PMP),一步之遥?-张传波-专题视频课程

    你和国际项目经理 PMP xff0c 一步之遥 xff1f 913人已学习 课程介绍 项目管理是门实战性超强的大学问 xff0c 项目经理是一位能把控全局的 狠 角色 xff01 你距离这样的 狠 角色有多远呢 xff0c 你应该如何规划自
  • RTOS任务切换原理与实现

    曾今只是使用过移植好的RTOS进行任务开发 xff0c 对其实现的底层原理一直一知半解 xff0c 正好接触到了李述桐老师的课程以及一些网上的资料 xff0c 让我对实时操作系统的原理有了更深的理解 xff0c 特此把一些原理和思考记录下来
  • python报错:Process finished with exit code -1066598274 (0xC06D007E) 解决方法

    1 在运行Mask RCNN项目时 xff0c 导入官网下载的代码和数据集 xff0c 准备运行时报此错误 2 原因 官网要求python版本是3 4 xff0c 但是我python编译器版本为3 9 3 解决 将编译器版本更换为3 7试试
  • OpenCV4学习笔记(72)——ArUco模块之aruco标记的创建与检测

    今天要整理记录的是OpenCV中ArUco模块的基础内容 xff0c 包含aruco标记的创建与检测 要注意的是ArUco模块是包含在OpenCV的contrib拓展库中的 xff0c 需要自行下载OpenCV基础库和contrib拓展库进
  • OpenCV4学习笔记(74)——ArUco模块之对aruco标记进行实时姿态估计

    在之前的笔记 OpenCV4学习笔记 xff08 72 xff09 中 xff0c 记录了在OpenCV中关于aruco标记的创建和检测这方面的内容 xff0c 今天就基于aruco标记检测来进一步实现对aruco标记的实时姿态估计 首先我
  • OpenCV4学习笔记(75)——ArUco模块之实现AR(增强现实)效果

    今天要整理记录的是利用OpenCV中ArUco模块的aruco标记实现一个增强现实的小应用 xff0c 当然了本次笔记的内容也是需要建立在之前的 OpenCV4学习笔记 xff08 72 xff09 基础上的 所谓增强现实 Augmente
  • Ubuntu18.04配置orb-slam2+ROS,一次性通过./build_ros.sh

    1 换源 建议采用清华的源 xff0c 如果采用阿里的源后面很多依赖会报错 xff0c 换源之后记得更新 xff0c 建议勾选源代码 sudo apt get update 1 1 报错error 解决 xff1a sudo apt get
  • process has died 报错

    报错提示 UnicodeEncodeError 39 ascii 39 codec can 39 t encode characters in position 345 350 ordinal not in range 128 spawn
  • Mysql问题Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column

    java sql SQLSyntaxErrorException Expression 2 of SELECT list is not in GROUP BY clause and contains nonaggregated column
  • 【SAP-FI】承诺项目(Commitment item)详解

    定义 xff1a 承诺项目表示组织在财务管理区域 xff08 FM区域 xff09 内的功能分组 用途 xff1a 承诺项目将影响流动性的预算交易和商业交易分类为收入 xff0c 支出和现金余额项目 您可以将特定责任区域 xff08 资金中
  • 操作系统--03内存管理

    内存管理 第三章 xff1a 内存管理 xff08 存储器管理 xff09 3 内存保护的两种办法 xff1a 3 1 覆盖与交换3 2 连续分配管理方式3 3 动态分区分配算法1 首次适应算法 xff1a 2 最佳适应算法 xff1a 3
  • SCRUM敏捷项目管理实战(深圳站)

    1 内容提要 SCRUM是目前各互联网公司普遍采用的敏捷项目管理模式 xff0c 与传统的项目管理十大知识领域相比 xff0c 敏捷更加直击要害 xff0c 更加强调自组织和跨职能团队 xff0c 更能帮助企业高效率交付和盈利 xff01
  • 2021年最新gitee使用教程

    gitee简介 Gitee com xff08 码云 xff09 是 OSCHINA NET 推出的代码托管平台 xff0c 支持 Git 和 SVN xff0c 提供免费的私有仓库托管 目前已有超过 600 万的开发者选择 Gitee 为
  • 在vscode中运行c、c++(超级简单)

    第一 下载安装vscode 第二 下载插件 链接 xff1a https pan baidu com s 1mLdKbQWxkZJYhwH0ToD9oQ 提取码 xff1a 3kxe 复制这段内容后打开百度网盘手机App xff0c 操作更
  • flameshot安装并配置插入文字描述、设置默认保存路径、将截图内容添加到粘贴板中

    flameshot配置插入文字描述 设置默认保存路径 将截图内容添加到粘贴板中 安装 xff1a https github com flameshot org flameshot releases 下载相应rpm包 xff0c 安装即可 以
  • 静态域[详解]

    不知道静态域是什么 目前有两种想法 1是代表static修饰的属性 方法等的集合 即所有static修饰的都算 2是认为仅仅代表静态代码块 即 static 下面正式研究 34 何为静态域 34 查到的文章基本分静态域 静态常量 静态方法这
  • OpenFlow 流表

    流规则组成 xff1a 每条流规则由一系列字段组成 xff0c 分为基本字段 条件字段和动作字段三部分 一 xff1a 基本字段 duration sec xff1a 表示流表项的生效时间 xff0c 以秒为单位 可以用来控制流表项的生命周
  • Gittee的使用

    Git Linus用C写的分布式版本控制系统 Git官网 xff1a https git scm com Gittee 国内代码托管和协作开发的平台 xff0c 可以看作为中文版的 GitHub 官网 xff1a Gitee 基于 Git
  • 使用VsCode管理Gitee仓库中的项目

    使用VsCode管理Gitee仓库中的项目的大致流程如下 1 首先得下载安装 git xff0c 详见 Git 详细安装教程详解 Git 安装过程的每一个步骤 mukes的博文 xff09 2 为 git 配置 username和email
  • Linux嵌入式开发之内存占用

    一 引言 内存是嵌入式系统中的关键资源 xff0c 内存占用主要是指软件系统的内存使用情况 本篇博客将介绍如何分析内存使用以便进行进一步优化内存占用相关的基础概念和相关工具 二 内存占用 内存占用是应用程序运行时内存的使用或引用数量 对于开