Linux资源-内存
1. 内存管理方式
大部分的内存管理方式,先对虚拟内存空间进行分段管理,然后再对每一个段进行分页管理。分为5类段,如下:
代码段: 代码段是用来存放可执行文件的操作指令
数据段: 数据段用来存放可执行文件中已初始化全局变量, 也就是存放程序静态分配的变量和全局变量
BBS段: BBS段包含程序未初始化的全局变量, 在内存中, BBS段全部置零
堆(heap): 堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可以动态扩张或缩减,当进程调用malloc等函数分配内存,新分配的内存就被动态添加到堆中;利用free等函数释放内存。
栈: 用户存放程序临时创建的局部变量, 也就是{}中定义的变 量(不包括static声明的)
此时的虚拟地址结构,就由段号、段内页号、页内偏移所组成。此时对于每个进程来说,都会建立一个段表,而对于段表中的每一个段,又会再分别建立一个页表,虚拟地址转换为物理地址,需要以下三个步骤
- 访问段表,得到页表的起始地址
- 访问页表,得到物理页的起始地址
- 访问物理页,加上页内偏移,得到实际的物理地址
2. 查看内存信息
1)/proc/meninfo 方式查看
[root@slave1 ~]# cat /proc/meminfo MemTotal: 1511992 kB MemFree: 519472 kB MemAvailable: 437220 kB Buffers: 0 kB Cached: 327220 kB CommitLimit: 3382340 kB Committed_AS: 1763672 kB
我们关注以上几个信息
- MemTotal:系统总内存,由于 BIOS、内核等会占用一些内存,所以这里和配置声称的内存会有一些出入,比如我这里配置有 2G,但其实只有 1.95G 可用。
- MemFree:系统空闲内存。
- MemAvailable:应用程序可用内存。有人会比较奇怪和 MemFree 的区别,可以从两个层面来区分,MemFree 是系统层面的,而 MemAvailable 是应用程序层面的。系统中有些内存虽然被使用了但是有一部分是可以回收的,比如 Buffers、Cached 及 Slab 这些内存,这部分可以回收的内存加上 MemFree 才是 MemAvailable 的内存值,这是内核通过特定算法算出来的,是一个估算值。
- Buffers:缓冲区内存
- Cached:缓存
- CommitLimit:内存分配限制
- Committed_AS:已分配内存大小
2)使用free方式查看

其中:total = used+free+buff/cache
shared :多进程的共享内存空间,不常用。
我们注意到 free 很小,buff/cache 却很大,这是 Linux 的内存设计决定的,Linux 的想法是内存闲着反正也是闲着,不如拿出来做系统缓存和缓冲区,提高数据读写的速率。但是当系统内存不足时,buff/cache 会让出部分来,非常灵活的操作。
3)top方式查看
top 命令运行时默认是按照 CPU 利用率进行排序的,如果要按照内存排序,该怎么操作呢?两种方法,一种直接按 “M”(相应的按 “P” 是 CPU),另外一种是在键入 top 之后,按下 “F”,然后选择要排序的字段,再按下 “s” 确认

- VIRT:virtual memory usage,进程占用的虚拟内存大小。
- RES:resident memory usage,进程常驻内存大小,也就是实际内存占用情况,一般我们看进程占用了多少内存,就是看的这个值。
- SHR:shared memory,共享内存大小,不常用。
内存管理参考:

浙公网安备 33010602011771号