详解:
- MemTotal: 所有内存(RAM)大小,减去预留空间和内核的大小。
- MemFree: 完全没有用到的物理内存,lowFree+highFree。
- MemAvailable: MemFree只是尚未分配的内存,并不是所有可用的内存。有些已经分配掉的内存是可以回收再分配的。比如cache/buffer、slab都有一部分是可以回收的,这部分可回收的内存加上MemFree才是系统可用的内存,即MemAvailable(不精确)。
- Buffers: 块设备所占用的缓存页。块设备(block device)所占用的特殊file-backed pages,包括:直接读写块设备,以及文件系统元数据(metadata)比如superblock使用的缓存页。
- Cached: 表示普通文件数据所占用的缓存页。用户进程的内存页分为两种:file-backed pages(与文件对应的内存页),和anonymous pages(匿名页),比如进程的代码、映射的文件都是file-backed,而进程的堆、栈都是不与文件相对应的、就属于匿名页。file-backed pages在内存不足的时候可以直接写回对应的硬盘文件里,称为page-out,不需要用到交换区(swap);而anonymous pages在内存不足时就只能写到硬盘上的交换区(swap)里,称为swap-out。
- SwapCached: swap cache中包含的是被确定要swapping换页,但是尚未写入物理交换区的匿名内存页。那些匿名内存页,比如用户进程malloc申请的内存页是没有关联任何文件的,如果发生swapping换页,这类内存会被写入到交换区。
- LRU:LRU是一种内存页回收算法,Least Recently Used,最近最少使用。LRU认为,在最近时间段内被访问的数据在以后被再次访问的概率,要高于最近一直没被访问的页面。于是近期未被访问到的页面就成为了页面回收的第一选择。Linux kernel会记录每个页面的近期访问次数,然后设计了两种LRU list: active list 和 inactive list, 刚访问过的页面放进active list,长时间未访问过的页面放进inactive list,回收内存页时,直接找inactive list即可。另外,内核线程kswapd会周期性地把active list中符合条件的页面移到inactive list中。
- Active: active包含active anon和active file。
- Inactive: inactive包含inactive anon和inactive file。
- Active(anon): anonymous pages(匿名页),用户进程的内存页分为两种:与文件关联的内存页(比如程序文件,数据文件对应的内存页)和与内存无关的内存页(比如进程的堆栈,用malloc申请的内存),前者称为file pages或mapped pages,后者称为匿名页。
- Inactive(anon): 见上。
- Active(file): 见上。
- Inactive(file): 见上。
- SwapTotal: 可用的swap空间的总的大小(swap分区在物理内存不够的情况下,把硬盘空间的一部分释放出来,以供当前程序使用)。
- SwapFree: 当前剩余的swap的大小。
- Dirty: 需要写入磁盘的内存页的大小。
- Writeback: 正在被写回的内存区的大小。
- AnonPages: 未映射页的内存的大小。Anonymous pages(匿名页)数量 + AnonHugePages(透明大页)数量。
- Mapped: 设备和文件等映射的大小。正被用户进程关联的file-backed pages。
- Slab: 内核数据结构slab的大小。slab是linux内核的一种内存分配器。
- SReclaimable: 可回收的slab的大小。
- SUnreclaim: 不可回收的slab的大小。
- PageTables: 管理内存页页面的大小。Page Table的用途是翻译虚拟地址和物理地址,它是会动态变化的,要从MemTotal中消耗内存。
- NFS_Unstable: 不稳定页表的大小。发给NFS server但尚未写入硬盘的缓存页。
- VmallocTotal: Vmalloc内存区的大小.可分配的虚拟内存总计.
- VmallocUsed: 已用Vmalloc内存区的大小
- VmallocChunk: vmalloc区可用的连续最大快的大小.通过vmalloc可分配的虚拟地址连续的最大内存