在嵌入式开发、系统运维和性能调优领域,对ARM架构的Linux系统进行内存监控是一项基础且至关重要的技能,由于ARM设备通常资源受限,精确地理解内存的分布、使用情况和潜在瓶颈,直接关系到系统的稳定性和效率,本文将系统性地介绍在ARM Linux环境下查看内存信息的多种方法,从快速概览到深度分析,帮助开发者全面掌握内存状态。

快速概览:free 命令
free 是最常用、最直观的内存查看工具,能够快速提供系统内存和交换空间的总体情况,推荐使用 -h(human-readable)参数,以KB、MB、GB等更友好的单位显示数据。
$ free -h
total used free shared buff/cache available
Mem: 1.9Gi 1.1Gi 125Mi 5.0Mi 718Mi 658Mi
Swap: 2.0Gi 0B 2.0Gi 为了准确解读free命令的输出,理解每个字段的含义至关重要,尤其是避免对Linux内存管理机制产生误解。
| 字段 | 含义 |
|---|---|
| total | 物理内存总量。 |
| used | 已使用的内存总量。注意: 这个值包含了buff/cache,并不完全代表应用程序占用的内存。 |
| free | 完全未被使用的、空闲的内存。 |
| shared | 多个进程共享的内存总量(如共享库、共享内存段)。 |
| buff/cache | 用于内核缓冲区和页面缓存的内存,这是Linux为提升I/O性能而缓存的数据,在需要时可以被应用程序快速回收。 |
| available | (关键指标) 可用于新应用程序启动的内存估算值,它是free内存加上可回收的buff/cache内存,是判断系统内存是否紧张的更可靠依据。 |
核心要点是,在Linux系统中,看到used内存很高而free内存很低,不必惊慌,只要available的值充足,系统运行通常就是健康的,内核会智能地利用空闲内存作为缓存,以加速文件读写和网络操作。
深度剖析:/proc/meminfo 文件
/proc/meminfo是Linux内核提供的一个虚拟文件,它记录了系统内存最详细、最原始的统计数据,所有用户态的内存监控工具,其数据源头都来自于此,通过cat /proc/meminfo可以查看到数十个内存相关的指标。
$ cat /proc/meminfo MemTotal: 1992448 kB MemFree: 128756 kB MemAvailable: 674880 kB Buffers: 32124 kB Cached: 605288 kB SwapCached: 0 kB Active: 845620 kB Inactive: 549688 kB ... Slab: 79960 kB SReclaimable: 43248 kB ...
除了MemTotal、MemFree和MemAvailable等与free命令对应的字段外,/proc/meminfo还提供了更细粒度的信息:
- Buffers: 用于块设备I/O的缓冲区大小。
- Cached: 用于文件内容的页面缓存大小。
- Active/Inactive: 活跃和非活跃内存列表的大小,内核会优先回收非活跃内存。
- Slab: 内核动态分配的数据结构(如inode、dentry)占用的内存。
SReclaimable部分是可以被回收的。 - SwapTotal/SwapFree: 交换空间的总大小和空闲大小。
当需要进行深度性能分析或调试内存相关问题时,直接分析/proc/meminfo能提供最根本的线索。

进程视角:top 与 htop 命令
了解系统总内存固然重要,但很多时候我们需要知道是哪个进程在消耗内存。top和其增强版htop是实时监控进程资源占用情况的首选工具。
在top的输出界面中,与内存相关的关键列包括:
- VIRT (Virtual Memory): 进程申请的虚拟内存总量,它包括了进程的代码、数据、共享库以及尚未映射到物理内存的内存区域,这个值通常很大,但不能直接反映物理内存的消耗。
- RES (Resident Memory): 进程当前使用的、未被交换出去的物理内存大小,这是衡量一个进程实际内存占用的核心指标。
- SHR (Shared Memory): 进程使用的共享内存大小,例如与其他进程共享的库或数据段。
在评估进程内存消耗时,应主要关注 RES 列,如果一个进程的VIRT值很高,但RES值很低,说明它可能只是预留了大量地址空间,并未实际占用那么多物理RAM。
高级分析:smem 命令
传统工具在计算共享内存时存在局限性,可能导致内存统计重复计算,10个进程都使用了同一个10MB的共享库,top可能会将这部分内存计算为100MB(10 * 10MB)。smem(Memory Statistics Tool)则提供了一个更准确的视角。
smem引入了两个重要的概念:
- PSS (Proportional Set Size): 比例集大小,它将一个进程使用的共享内存(如库)按比例分配给它,一个10MB的库被10个进程使用,那么每个进程的PSS中只计算1MB,PSS被认为是衡量进程有效内存占用的最佳指标。
- USS (Unique Set Size): 唯一集大小,指进程独自占用的、不与任何其他进程共享的物理内存。
使用smem -r -s pss可以按PSS值降序排列所有进程,从而快速定位到真正消耗大量内存的“元凶”。

相关问答FAQs
问题1:为什么我的ARM Linux系统可用内存很少,但运行却很流畅?
解答: 这是Linux内存管理机制的正常表现,Linux内核会尽可能地将空闲内存用作文件缓存和缓冲区,即buff/cache,这部分缓存可以显著提升文件读写、数据库查询等I/O密集型操作的性能,当应用程序需要更多内存时,内核会立即从buff/cache中回收一部分内存分配给应用程序。free命令显示的free内存很低,并不代表系统内存紧张,你应该关注的是available字段的值,它才是真正可用于新进程的内存量,只要available充足,系统就能保持流畅运行。
问题2:在top命令中,VIRT和RES有什么区别,我应该关注哪个?
解答: VIRT(Virtual Memory)是进程的虚拟内存地址空间大小,它包含了代码、数据、共享库,甚至还包括了那些申请了但尚未实际分配物理页的内存,这个值通常很大,但它并不直接消耗物理RAM,RES(Resident Memory)是进程当前实际占用的物理内存大小,是实实在在已经加载到RAM中的数据,在评估一个进程的内存消耗时,RES是远比VIRT更有价值、更值得关注的指标,一个高VIRT但低RES的进程,通常只是“虚胖”,对系统内存的实际压力并不大。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复