Linux嵌入式开发之内存占用

一、引言

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

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

二、内存占用

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

对于开发者而言,可以使用的内存量决定了程序使用的复杂性。较大的应用程序需要更多的内存来存储数据和源代码,例如微软软件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。

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值